模块 OpenSSL::Random

公共类方法

egd(filename) → true 点击切换源代码

::egd_bytes 相同,但默认查询 255 个字节。

static VALUE
ossl_rand_egd(VALUE self, VALUE filename)
{
    if (RAND_egd(StringValueCStr(filename)) == -1) {
        ossl_raise(eRandomError, NULL);
    }
    return Qtrue;
}
egd_bytes(filename, length) → true 点击切换源代码

查询由 filename 指定的套接字路径上的熵收集守护进程 EGD。

获取 length 个字节并使用 ::add 来播种 OpenSSL 内置的 PRNG。

static VALUE
ossl_rand_egd_bytes(VALUE self, VALUE filename, VALUE len)
{
    int n = NUM2INT(len);

    if (RAND_egd_bytes(StringValueCStr(filename), n) == -1) {
        ossl_raise(eRandomError, NULL);
    }
    return Qtrue;
}
load_random_file(filename) → true 点击切换源代码

filename 读取字节并将其添加到 PRNG。

static VALUE
ossl_rand_load_file(VALUE self, VALUE filename)
{
    if(!RAND_load_file(StringValueCStr(filename), -1)) {
        ossl_raise(eRandomError, NULL);
    }
    return Qtrue;
}
add(str, entropy) → self 点击切换源代码

将来自 str 的字节混合到伪 Random 随机数生成器 (PRNG) 状态中。

因此,如果来自 str 的数据对于攻击者来说是不可预测的,那么这将增加对状态的不确定性,并使 PRNG 输出更难以预测。

entropy 参数是 (下限) 对 str 中包含多少随机性的估计,以字节为单位。

示例

pid = $$
now = Time.now
ary = [now.to_i, now.nsec, 1000, pid]
OpenSSL::Random.add(ary.join, 0.0)
OpenSSL::Random.seed(ary.join)
static VALUE
ossl_rand_add(VALUE self, VALUE str, VALUE entropy)
{
    StringValue(str);
    RAND_add(RSTRING_PTR(str), RSTRING_LENINT(str), NUM2DBL(entropy));

    return self;
}
random_bytes(length) → string 点击切换源代码

生成一个包含 length 个加密强伪随机字节的字符串。

示例

OpenSSL::Random.random_bytes(12)
#=> "..."
static VALUE
ossl_rand_bytes(VALUE self, VALUE len)
{
    VALUE str;
    int n = NUM2INT(len);
    int ret;

    str = rb_str_new(0, n);
    ret = RAND_bytes((unsigned char *)RSTRING_PTR(str), n);
    if (ret == 0) {
        ossl_raise(eRandomError, "RAND_bytes");
    } else if (ret == -1) {
        ossl_raise(eRandomError, "RAND_bytes is not supported");
    }

    return str;
}
seed(str) → str 点击切换源代码

::seed 等效于 ::add,其中 entropystr 的长度。

static VALUE
ossl_rand_seed(VALUE self, VALUE str)
{
    StringValue(str);
    RAND_seed(RSTRING_PTR(str), RSTRING_LENINT(str));

    return str;
}
status? → true | false 点击切换源代码

如果 PRNG 已播种足够的数据,则返回 true,否则返回 false

static VALUE
ossl_rand_status(VALUE self)
{
    return RAND_status() ? Qtrue : Qfalse;
}
write_random_file(filename) → true 点击切换源代码

将一定数量的随机生成的字节(目前为 1024)写入到filename 文件中,该文件可用于在后续会话中调用 ::load_random_file 来初始化 PRNG。

static VALUE
ossl_rand_write_file(VALUE self, VALUE filename)
{
    if (RAND_write_file(StringValueCStr(filename)) == -1) {
        ossl_raise(eRandomError, NULL);
    }
    return Qtrue;
}