7 encryption cocoa key aes salt
我正在阅读一本关于如何加密密钥以使您的加密安全的教程,但是无法做很多事情.我对密码学知之甚少,需要一些帮助.我使用commoncrypto来加密文件,并且完成了,除了它不安全的事实...
这就是我所拥有的:
- (NSData *)AES256EncryptWithKey:(NSString *)key
{
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256 + 1]; // room for terminator (unused)
bzero( keyPtr, sizeof( keyPtr ) ); // fill with zeroes (for padding)
NSLog(@"You are encrypting something...");
// fetch key data
[key getCString:keyPtr maxLength:sizeof( keyPtr ) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
//See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//That's why we need to add the size of one block here
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc( bufferSize );
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt( kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
NULL /* initialization vector (optional) */,
[self bytes], dataLength, /* input */
buffer, bufferSize, /* output */
&numBytesEncrypted );
if( cryptStatus == kCCSuccess )
{
//the returned NSData takes ownership of the buffer and will free it on deallocation
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free( buffer ); //free the buffer
return nil;
}
Run Code Online (Sandbox Code Playgroud)
如果有人可以帮助我,并告诉我我将如何实施盐,这将是伟大的!再次感谢!
Ivo*_*Ivo 15
dYhG9pQ1qyJfIxfs2guVoU7jr9oniR2GF8MbC9mi
AKA摇摇欲坠,试图让它难以辨认.这是你在密码学中玩的游戏.为此,您使用确定性函数.
加密涉及使用一个带有两个参数的函数:通常是一个短的,固定长度的,一个是任意长度的.它产生的输出与第二个参数的大小相同.
我们称第一个参数为关键; 第二,明文; 和输出,密文.
这将具有反函数(有时是相同的),它具有相同的签名,但是相反,密文将返回明文(当使用相同的密钥时).
显然,良好加密函数的特性是明文在不知道密钥的情况下不易从密文中确定.更好的一个将产生与随机噪声无法区分的密文.
散列涉及一个函数,它接受一个任意大小的参数,并返回固定大小的输出.这里的目标是,给定一个特定的输出,应该很难找到任何产生它的输入.它是单向函数,因此它没有逆.再次,如果输出看起来完全随机,那真是太棒了.
以上内容非常好,但在设计这些功能的实现时,我们的最终目标是难以理解:它们是确定性的!这对于产生随机输出没有好处.
虽然我们可以设计仍然产生非常随机输出的函数,但由于混淆和扩散,它们仍然会在给定相同输入的情况下提供相同的输出.我们都需要这个,不喜欢它.我们永远无法用非确定性加密系统破译任何东西,但我们不喜欢可重复的结果!可重复意味着可分析......可确定(呵呵).我们不希望敌人看到相同的两个密文,并且知道它们来自相同的输入,这将为他们提供信息(以及打破加密系统的有用技术,如彩虹表).我们如何解决这个问题?
这就是我们打败它的方式!每当我们使用我们的函数时,我们在实际输入之前添加(或有时更好,追加)一些独特的随机输入.这使得即使我们给出相同的输入,我们的确定性函数也会给出不同的输出.我们发送唯一的随机输入(当进行散列时,称为盐;加密时称为初始化向量,或IV)以及密文.敌人是否看到这种随机输入并不重要; 我们的实际输入已经受到我们的密钥(或单向散列)的保护.我们实际上担心的是我们的输出始终不同,所以它是不可分析的; 我们已经实现了这一目标.
好.所以每个人都有自己的应用程序,其中包含保护应用程序部分的密码系统.
现在我们不想用密码系统重新发明轮子(最糟糕的.想法.永远.),所以一些真正知识渊博的人已经提出了可以构建任何系统的好组件(即AES,RSA,SHA2,HMAC, PBKDF2).但如果每个人都使用相同的组件,那么仍然会引入一些可重复性!幸运的是,如果每个人在他们自己的密码系统中使用不同的密钥和独特的初始随机输入,它们应该没问题.
我们来谈谈你的例子吧.你想要做一些简单的加密.我们想要什么?好吧,A)我们想要一个好的随机密钥,而B)我们想要一个好的随机IV.这将使我们的密文尽可能安全.我可以看到你没有提供随机的IV - 这是更好的做法.从[secure/crypto] -random源获取一些字节,并将其放入.您将这些字节与密文一起存储/发送.是的,这确实意味着密文是一个比明文更大的恒定长度,但这是一个很小的代价.
那钥匙怎么样?有时我们想要一个可记忆的密钥(比如......密码),而不是计算机喜欢的随机密钥(如果你可以选择只使用随机密钥 - 那就这样做).我们可以妥协吗?是! 我们应该将ASCII字符密码转换为字节来制作密钥吗?一定不行!
ASCII字符根本不是很随机(哎呀,它们通常只使用8中的6-7位).如果有的话,我们想做的就是让我们的钥匙至少看起来随意.我们如何做到这一点?好吧,散列恰好对此有好处.如果我们想重用我们的密钥怎么办?我们将再次获得相同的哈希...重复性!
幸运的是,我们使用另一种形式的独特随机输入 - 盐.制作一个独特的随机盐,并将其附加到您的密钥.哈希吧.然后使用字节加密您的数据.在发送时添加salt和IV以及密文,您应该能够在最后解密.
几乎完成了?没有!您看到我在上面段落中描述的散列解决方案?真正的密码学家会称之为业余.你会相信一个业余的系统吗?没有!我会讨论为什么它是业余的吗?不,'你不需要知道.基本上,它并不足以满足他们的喜好.
你需要知道的是,他们已经为这个问题设计了一个更好的系统.它叫做PBKDF2.找到它的实现,并[学习]使用它.
现在您的所有数据都是安全的.
| 归档时间: |
|
| 查看次数: |
2499 次 |
| 最近记录: |