如何生成用于承载令牌的加密安全随机数



我想生成一个安全的随机数,用于vapor swift中的承载令牌。

我看过OpenCrypto,但它似乎无法生成随机数。

我该怎么做?

对于Vapor,您可以生成这样的令牌:

[UInt8].random(count: 32).base64

这将是加密安全使用。你可以像在这个回购中一样使用它

您可能需要查看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。如文件所示:

SystemRandomNumberGenerator是自动播种的,可以安全地在多个线程中使用,并尽可能使用加密安全算法。

;只要可能";可能会让您暂停,具体取决于如何部署。如果它在平台的枚举列表中,您可以检查它们是否使用CSPRNG"几乎";(见下文(所有当前平台都有:

  • 苹果平台使用arc4random_buf(3(。

  • Linux平台在可用时使用getrandom(2(;否则,他们会阅读来自/dev/urandom。

  • Windows使用BCryptGenRandom。

在Linux上,getrandom明确适用于加密目的,如果它还不能提供良好的熵,则进行阻止。请参阅源代码以了解其实现。具体来说,如果熵池还没有初始化,它将阻塞:

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_arandom可以在初始化之前读取/dev/urandom。这是一种罕见的情况(通常在启动后立即发生,尽管可能是由于其他进程快速消耗熵(,但它可以减少值的随机性。在目前支持的Swift平台中,我相信这只会影响CentOS 7。

在Windows上,BCryptGenRandom被证明适用于加密随机数:

默认随机数提供程序实现了一种生成随机数的算法,该算法符合NIST SP800-90标准,特别是该标准的CTR_DRBG部分。

SP800-90涵盖了算法和熵要求。

最新更新