问题描述
我看过OpenCrypto,但似乎无法生成随机数。
我该怎么做?
解决方法
对于蒸气,您可以像这样生成令牌:
[UInt8].random(count: 32).base64
使用密码将安全使用。您可以像在this repo
中那样使用它 ,您可能想看看SecRandomCopyBytes(_:_:_:)
:
生成一组加密安全的随机字节。
var bytes = [Int8](repeating: 0,count: 10)
let status = SecRandomCopyBytes(kSecRandomDefault,bytes.count,&bytes)
if status == errSecSuccess { // Always test the status.
print(bytes)
// Prints something different every time you run.
}
,
通常(但请继续阅读),您需要使用SystemRandomNumberGenerator来实现。为documented:
SystemRandomNumberGenerator是自动播种的,可以在多个线程中安全使用,并在可能的情况下使用加密安全算法。
根据可能的部署方式,“尽可能”可能会让您暂停。如果它在平台的枚举列表中,则可以检查它们是否使用CSPRNG。所有当前平台都“几乎”(请参见下文):
Apple平台使用arc4random_buf(3)。
Linux平台在可用时使用getrandom(2);否则,他们会读 来自/ dev / urandom。
Windows使用BCryptGenRandom。
在Linux上,getrandom
明确适用于加密目的,如果尚不能提供良好的熵,则将其阻塞。有关其实现,请参见source。具体来说,如果熵池尚未初始化,它将阻止:
if (!(flags & GRND_INSECURE) && !crng_ready()) {
if (flags & GRND_NONBLOCK)
return -EAGAIN;
ret = wait_for_random_bytes();
if (unlikely(ret))
return ret;
}
在没有getrandom
的系统上,我相信SystemRandomNumberGenerator使用的swift_stdlib_random在初始化之前可能会读取/ dev / urandom。这是一种罕见的情况(通常是在启动后立即执行,尽管可能是由于其他进程正在迅速消耗熵),但它可以减少值的随机性。在目前支持的Swift平台中,我相信这只会影响CentOS 7。
在Windows上,BCryptGenRandom被证明适用于密码随机数:
默认随机数提供程序实现了一种用于生成符合NIST SP800-90标准(特别是该标准的CTR_DRBG部分)的随机数的算法。
SP800-90涵盖了算法要求和熵要求。