【问题标题】:Create random 128 bit AES Encryption key in iOS在 iOS 中创建随机 128 位 AES 加密密钥
【发布时间】:2016-04-03 08:29:46
【问题描述】:

我想在 ios 中创建随机 AES 加密密钥(128 位)。我在 SO 中进行了搜索,但找不到好的答案。请给我一些建议。提前致谢。

更新:

我使用过 BBAES 库。我使用下面的代码生成加密密钥,但是当我从 NSData 转换为 NSString 时,它显示为 NULL

  -(NSData*)randomDataWithLength{
    NSData* salt = [BBAES randomDataWithLength:BBAESSaltDefaultLength];
    NSData *key = [BBAES keyBySaltingPassword:@"password" salt:salt keySize:BBAESKeySize128 numberOfIterations:BBAESPBKDF2DefaultIterationsCount];
    NSLog(@"Data ASE Key %@",key);
    NSString *aString  = [[NSString alloc] initWithData:key encoding:NSUTF8StringEncoding];
}

【问题讨论】:

  • 有很多很多的库可以帮助解决这个问题。
  • @all:我已经更新了我的问题。
  • 为什么要将其转换为 NSString?它是NULL,因为没有任何随机数据是有效的 UTF8 字符串

标签: ios objective-c cocoa-touch aes


【解决方案1】:

哇,这是一个简单任务的复杂代码!

- (NSData *)random128BitAESKey {
    unsigned char buf[16];
    arc4random_buf(buf, sizeof(buf));
    return [NSData dataWithBytes:buf length:sizeof(buf)];
}

您可能听说过您应该使用盐并对密码进行哈希处理。看起来您的建议有点过头了:这里没有没有密码,但您的代码仍然对数据进行加盐和哈希处理!当输入来自像arc4random 这样的安全随机数生成器时,这完全没用。

当然它不会转换为NSString,因为随机数据不太可能是有效的 UTF-8 字符串。

【讨论】:

  • 非常感谢。但是我怎样才能把这个密钥写到文件中呢?谢谢
  • 你说得对,但我相信 arc4random 并不总是加密安全的。 SecRandomCopyBytes 是用于 AES 密钥的 RNG 函数。
  • @ChrisDevereux:您对此有引用吗?据我所知,arc4random 被设计用于密码学,所以只要正确播种应该没问题。
  • 嗯,我可能一直在考虑别的事情。对不起。看起来 ARC4 有一些问题,但我不能说它在这里是否相关......en.wikipedia.org/wiki/RC4
【解决方案2】:

您可能希望为此使用 Apple 的随机字节生成器,它被认为比 arc4random 更安全。

int SecRandomCopyBytes ( SecRandomRef rnd, size_t count, uint8_t *bytes ); 

https://developer.apple.com/library/ios/documentation/Security/Reference/RandomizationReference/index.html#//apple_ref/c/func/SecRandomCopyBytes

可以在 James Carroll 的博客文章中找到一个很好的解释:

http://jamescarroll.xyz/2015/09/09/safely-generating-cryptographically-secure-random-numbers-with-swift/

Open Whisper Systems 将其用于其流行的安全聊天应用 Signal 的 iOS 版本

【讨论】:

    【解决方案3】:

    这可能会有所帮助

    - (NSString *)getRandomKey{
        NSString *alphabet  = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789/=+";
        NSMutableString *s = [NSMutableString stringWithCapacity:20];
        for (NSUInteger i = 0; i < 20; i++) {
            u_int32_t r = arc4random() % [alphabet length];
            unichar c = [alphabet characterAtIndex:r];
            [s appendFormat:@"%C", c];
        }
        NSLog(@"%@", s);
        NSString *key = s;
        return key;
    }
    

    【讨论】:

    • 我不会将此算法用于与安全相关的任何事情
    • @BryanChen:请告诉我为什么不用这个算法?
    • 通常这些随机函数确实依赖于时间,这使得攻击者可以预测它们。由于模偏差 (stackoverflow.com/questions/648739/objective-c-modulo-bias) 也不推荐使用 arc4random
    • @Lukas:arc4random 不是那些以time() 为种子的 RNG 之一——实际上,它是一个安全的 RNG,与其他 RNG 相比相当慢,它是密钥生成的正确选择。但是,您对模偏差是正确的。
    • 不要使用arc4random() % range会有一些模偏差,使用arc4random_uniform(range)
    猜你喜欢
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    相关资源
    最近更新 更多