【问题标题】:NSMutableData to NSStringNSMutableData 到 NSString
【发布时间】:2019-04-30 13:15:32
【问题描述】:

大家好,我正在我的应用中使用对称加密来加密用户相互发送的消息。现在我正在尝试创建一个相当安全的密钥来使用 NSMutableData 解密这些数据(解密密钥)。目前我有两个问题:

  1. 用于解密的 256 位密钥是否足够安全?

  2. 我在使用 NSString 时遇到了一些问题。当我想检索 NSMutableData 的字符串值时,我的 NSLog 总是返回一个空值

我哪里做错了?

NSMutableData *masterKey = [NSMutableData dataWithLength:32];
    int result = SecRandomCopyBytes(kSecRandomDefault, 32, masterKey.mutableBytes);
    if (result != noErr) {
        NSLog(FAILED_MASTERKEY);
        return;
    }
NSLog(@"MASTER %@",[[NSString alloc] initWithData:masterKey encoding:NSUTF32StringEncoding]);

2018-11-28 16:06:31.803868+0100 [41860:9341804] MASTER (null)

【问题讨论】:

  • 您在哪种模式下使用哪种加密算法?您显示的代码不包含任何有关加密的代码?只有SecRandomCopyBytesGenerates an array of cryptographically secure random bytes. 另外,你有两个问题没有真正解决。
  • 我建议你把它分成两个单独的问题。正如下面这个问题的标题所建议的那样,我已经回答了“如何创建任意二进制值的字符串表示”。但加密问题似乎完全不同。
  • Re globallyUniqueString,这似乎可以确保唯一性,但我认为没有任何迹象表明加密稳健的随机性。我会坚持使用加密函数。
  • 当您发布单独的加密问题时,我建议您退后一步,提供更广泛的背景信息。生成单个加密密钥的整个概念似乎令人怀疑,引入了如何在各种设备之间共享它的问题。我本来希望您希望在每台设备上生成密钥对并交换公钥或类似的东西。
  • 你不能随便拿一些随机数据说那是EC加密密钥,它不是这样工作的。您需要从 CommonCrypto 原生框架中查看 SecKeyGeneratePair 函数,或者为此找到一个好的库。

标签: ios objective-c cryptography nsstring nsmutabledata


【解决方案1】:

您不能直接从任意二进制数据创建NSString。替代方法包括显示十六进制表示(例如来自description 方法)或使用二进制数据的其他文本表示(例如base-64)。但你不能只将随机二进制数据传递给-[NSString initWithData:encoding:]

NSLog(@"Hex:     %@", [masterKey description]);
NSLog(@"Hex:     %@", masterKey);                                   // directly logging the `NSData` will also use its `description`
NSLog(@"Base 64: %@", [masterKey base64EncodedStringWithOptions:0]);

通过 Web 服务交换二进制数据的常用技术是 base-64。但是,如果目的只是记录值以便您可以看到确实生成了一个值,那么只记录其description 是最简单的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    相关资源
    最近更新 更多