我所在的团队接手了一些服务器端代码(使用Java语言),用于生成随机令牌。我对此有一个问题:
这些令牌的用途相当敏感,用于会话ID、密码重置链接等,因此需要具有加密级别的随机性,以避免有人猜测或尝试暴力破解。这个令牌是一个“long”类型,长度为64位。
目前该代码使用java.util.Random
类来生成这些令牌。 java.util.Random文档清楚地说明了以下内容:
java.util.Random
的实例不具备加密安全性。考虑改用SecureRandom获取用于安全敏感应用程序的具有加密安全性的伪随机数生成器。
但是,代码目前使用java.util.Random
的方式是 - 它实例化了java.security.SecureRandom
类,然后使用SecureRandom.nextLong()
方法获取种子,用于实例化java.util.Random
类。然后它使用java.util.Random.nextLong()
方法生成令牌。
那么我的问题是 - 给定java.util.Random
使用java.security.SecureRandom
进行种子生成,它仍然不安全吗?我需要修改代码,以便仅使用java.security.SecureRandom
来生成令牌吗?
目前该代码在启动时对Random
进行了一次种子设置。
Random
,还是每个令牌都会种植一个新的?希望这不是一个愚蠢的问题,但我想确认一下。 - Tom Anderson