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

问题描述

我想生成一个安全的随机数,用于蒸气迅速的无记名令牌。

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

我该怎么做?

解决方法

对于蒸气,您可以像这样生成令牌:

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

使用密码将安全使用。您可以像在this repo

中那样使用它 ,

您可能想看看SecRandomCopyBytes(_:_:_:)

来自Apple documentation

生成一组加密安全的随机字节。

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涵盖了算法要求和熵要求。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...