随机唯一字符串生成用作nonce(oauth)

sri*_*vas 5 ios nonce swift

我试图使用UUID生成作为一个nonce用于Twitter反向身份验证.但显然UUID不是一个好选择.那么我怎样才能在每次删除所有非单词字符时生成一个唯一的随机字符串,注意它在使用后会从内存中释放出来.以下代码崩溃.

    var uuid: CFUUIDRef = CFUUIDCreate(nil)
    var nonce: CFStringRef = CFUUIDCreateString(nil, uuid)
    CFRelease(uuid)

    println("createdNonce:\(nonce)")
Run Code Online (Sandbox Code Playgroud)

编辑: 我在xcode6 beta2,我无法调试,xocde崩溃,任何机会它.好吧,CFRelease部分对我来说很糟糕.一旦我删除,它似乎工作正常,但我不知道这是否会造成内存泄漏.

至于为什么UUID可能不是用于nonce的好选择,似乎是因为UUID不是由真正的随机位组成,请参考这里的讨论:https://github.com/aws/aws-sdk-ios/issues/30

Kru*_*lur 9

生成随机数的更正确方法可能是使用加密RNG生成随机字节.iOS碰巧有这样的事情:

var s = NSMutableData(length: 32)
SecRandomCopyBytes(kSecRandomDefault, UInt(s.length), UnsafePointer<UInt8>(s.mutableBytes))

// s is now a NSData containing 32 random bytes
Run Code Online (Sandbox Code Playgroud)

然后使用API​​建议的任何格式(可能是Base64)转换为字符串,例如

let base64str = s.base64EncodedStringWithOptions(0)
Run Code Online (Sandbox Code Playgroud)

编辑:上面的方法似乎是Twitter在文档中使用的方法.看到这里.我不能说UUIDS是否更容易被预测.这取决于它们生成的方法.SecRandomCopyBytes似乎用于加密目的,因此它应该是安全的.

  • 斯威夫特有很多变化.现在看起来更像这样:`SecRandomCopyBytes(kSecRandomDefault,s!.length,UnsafeMutablePointer <UInt8>(s!.mutableBytes))`和`let base64String = s!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(0))` (4认同)

小智 5

使用 SwiftUI 5.x 和 CryptoKit,这很容易:

import CryptoKit

let nonce = ChaChaPoly.Nonce.init()
Run Code Online (Sandbox Code Playgroud)

正在使用:

let encryptedContent = try! ChaChaPoly.seal(inputBuffer, using: symmetricKey, nonce: ChaChaPoly.Nonce.init()).combined
Run Code Online (Sandbox Code Playgroud)