SecureRandom每次都能保证不同的值吗?

ovu*_*tin 0 java security random cryptography

我需要生成加密安全,随机唯一的字符串,每个字符串实际上将用作访问令牌.为此,我计划使用Java的SecureRandom类.但是,我不确定SecureRandom是否保证了它的独特性.换句话说,SecureRandom在每次生成时都会产生不同的值吗?

似乎创建具有seed值(即new SecureRandom(byte[] seed))的实例可能有效.但是,我不确定.此外,这个答案说种子既不安全也不便携.种子价值服务器是我的目的吗?

如果您有SecureRandom以外的建议,我也希望听到它们.

Erw*_*idt 8

不,一个SecureRandom实例就不能保证唯一结果.如果它确实保证,它不会完全随机,因为你会知道你无法得到你已经收到的结果.

设置种子值不会改善这种情况.它也不会使情况变得更糟,因为你传递的种子被添加(补充)由SecureRandom实现内部生成的种子.

如果您需要保证唯一的随机数,则需要保留所有先前生成的数字,然后检查何时生成新数字(如果已经返回).如果有,则需要生成一个新数字(并重复检查).

但是,如果您生成的数字非常大,则生成非唯一数字的可能性变得非常小.尝试生成256位或更多(32字节)的数字.这也是UUID用于生成"唯一"数字的机制.这些也不能保证是独一无二的,但在获得重复之前,你必须等待非常长的时间(平均).

  • 有关不同的随机值,请参阅[如何生成唯一随机字符串列表?](http://crypto.stackexchange.com/questions/1379/how-to-generate-a-list-of-unique-random-strings) . (2认同)