盐为安全加密Cocoa的关键?

时间:2011-09-05 17:35:00

标签: cocoa encryption 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;
}

如果有人可以帮助我,并向我展示我将如何实施盐,那就太棒了!再次感谢!

3 个答案:

答案 0 :(得分:15)

答案 1 :(得分:1)

Salting只需在输入键的末尾添加一个随机字符串。

因此生成一段长度的随机字符串:

Generate a random alphanumeric string in cocoa

然后使用以下方法将其附加到密钥:

NSString *saltedKey = [key stringByAppendingString:salt];

除非你在文章中以不同的方式使用盐,否则你应该这是正确的。

答案 2 :(得分:1)

通常如何使用随机盐:

@ Ca1icoJack完全正确地说,您所要做的就是生成一些随机数据并将其追加到最后。数据通常是二进制的,而不是字母数字。然后将盐与每个散列密码一起加密存储,并与用户的明文密码连接,以便每次输入密码时检查散列。

如果SALT在散列密码旁边未加密存储,那又是什么意思?

假设有人可以访问您的哈希密码。人类选择的密码很容易通过彩虹表被发现。添加哈希意味着彩虹表不仅需要包含具有人可能使用的字母数字字符的任何可能组合的值,还需要包含随机二元盐,这在这个时间点是相当不切实际的。因此,基本上添加盐意味着有权访问散列密码和盐的暴力攻击者都需要知道如何将盐连接到密码(通常在之前或之后)逐个强制使用每个密码,因为现成的彩虹表不包含任何随机二进制数据。

编辑:但我说加密了,没有哈希:

好的,我没有仔细阅读,不理我。无论加密密钥是否加密,都必须对密钥进行暴力破解。我能看到的唯一可辨别的好处就是该文章说避免使用相同的密钥(从用户的角度来看)用于加密相同的数据会产生相同的结果。由于不同的原因,这在加密中很有用(加密的消息往往具有可以用来帮助更容易地破解加密的重复部分),但是评论者注意到在这种情况下通常不会被称为salt。

无论如何,连接盐的技巧,并将其与每一位加密数据一起存储。