生成随机数据

libsodium库提供一组函数,来产生不可预测的数据,适合用来作为密钥。

  • 在 Windows 系统, 使用 RtlGenRandom() 函数
  • 在 OpenBSD 和 Bitrig 上, 使用 arc4random() 函数
  • 在较新的 Linux 内核上, 使用 getrandom系统调用 (从 Sodium 1.0.3 开始)
  • 在其它 Unix 类系统上, 使用 /dev/urandom 设备
  • 如果以上选项都无法安全地使用,自定义的实现可以很容易地 hook 进来。

用法

uint32_t randombytes_random(void);

randombytes_random() 函数返回一个在 00xffffffff (包含) 之间的不可预测的值。

uint32_t randombytes_uniform(const uint32_t upper_bound);

randombytes_uniform() 函数返回一个 0upper_bound (不包含) 之间的不可预测的值. 不是简单地 randombytes_random() % upper_bound, 本函数尽可能保证可能输出值的概率均匀分布。

void randombytes_buf(void * const buf, const size_t size);

randombytes_buf() 函数用不可预测的字节序列填充 buf 开始的 size 字节。

int randombytes_close(void);

本函数释放伪随机数生成器使用的全局资源。具体地说,如果使用了 /dev/urandom,本函数关闭描述符。 基本不需要显式调用本函数。

void randombytes_stir(void);

如果支持, randombytes_stir() 函数 重设 伪随机数生成器的种子。对默认的伪随机数生成器,不需要调用本函数。就算 fork()之后也不需要。 除非调用 randombytes_close() 关闭了 /dev/unrandom 的描述符 fd 。

如果使用了一个非默认的实现, (看 randombytes_set_implementation()), randombytes_stir() 必须 在 fork() 之后的子进程中调用 。

Note

如果在一个 VM 中的应用程序中使用这些函数,并且 VM 被做了快照并恢复了,那这些函数有可能产生相同的输出。

results matching ""

    No results matching ""