应用程序的每次启动时,应创建一条 128 位的随机消息,以便该消息之前未被以最大概率选择,并且这也应该是安全的(即不能被某些黑客破坏)。例如,使用带有从系统时间获取的种子的标准随机生成器并不安全,因为它可以通过以某种方式冻结系统时间来破坏(无论如何这可能吗?)。
Windows 函数 CryptGenRandom 似乎适合于此。但有便携式替代品吗?如果没有,Linux和Mac有对应的功能吗?
Windows 函数 CryptGenRandom 似乎适合于此。但有便携式替代品吗?
这取决于你如何看待它;我不确定是否有一个独立的包装器可以直接包装平台 RNG。但大多数加密库都会有一个随机生成器,它直接引用或(更有可能)从操作系统随机数生成器播种本身。
例如,请在
此处阅读 Crypto++ 的
AutoSeeded
生成器。这些库从操作系统提供的功能中抽象出来,为您提供了一个可移植的选项,可以最大限度地减少对底层平台的调用(即它们既安全又快)。
如果没有,Linux和Mac有对应的功能吗?要直接使用加密随机数,请使用
/dev/urandom
。一般来说,没有理由使用可能会阻塞的
/dev/random
。不过,我建议使用经过严格审查的库。
额外的种子也可以添加到随机数生成器中,因此,如果您有任何看起来随机的东西,如果您不确定随机数的强度,则将其添加为种子可能是明智的选择。
拥有带有 RNG 扩展(由操作系统或库使用)的 CPU,例如 Intel RD_RAND 当然也可能有意义。
getrandom:
getrandom() 系统调用将 buf 指向的缓冲区填充为 最多 buflen 随机字节。 这些字节可用于种子用户 空间随机数生成器或用于加密目的。