模块 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 个密码学强伪随机字节的 String
。
示例¶ ↑
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,其中 entropy 是 str 的长度。
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; }