- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
(这是 SLES 上的 Java 8 和 Tomcat 8,FWIW。)
我需要多担心 SecureRandom
的性能问题? (特别是 SHA1PRNG
提供程序的 SUN
算法)在我使用单个 SecureRandom
的初始播种之后多线程中的实例? SecureRandom
是线程安全的,所以这意味着某种程度的潜在争用?
我在 Java 8 Javadocs 中没有看到任何关于 SecureRandom
的讨论尽管我看到 Random
的 Javadocs使用单个 Random
时,请特别警告争用和性能下降跨线程实例。
我们正在考虑使用单个 SecureRandom
例如,因为据我们所知,获得新的 SecureRandom
太贵了。我们的实例 encrypt()
方法(使用 SecureRandom
生成 IV),因为如果您使用新的 SecureRandom
,播种开销会杀死您在你完成它之前很少几次。
我们正在考虑使用静态 ThreadLocal<SecureRandom>
包含 encrypt()
的类的成员方法使单个 SecureRandom
每个线程使用。我们会故意不调用ThreadLocal.remove()
因为如果我们走这条路,我们实际上希望实例尽可能长时间地“存在”在 tomcat 线程中(以尽量减少创建新 SecureRandom
实例的次数)。
从这里阅读关于 ThreadLocal
内存泄漏 我对这种方法有些担忧。然而,我们确实从不重新部署网络应用程序。它用于嵌入式系统,当 webapp 升级时(这是整个系统升级的一部分,一年只发生几次)Tomcat 完全关闭,新的 war 文件下降,Tomcat 重新启动。这似乎是使 webapp 相关的 ThreadLocal
泄漏没有实际意义。
那么,是否有任何关于“有争议”的好数据SecureRandom
是,并且是否就如何最正确地使用 SecureRandom
达成共识?在大量多线程的环境中?
最佳答案
查看SecureRandom
的源代码, 它使用 synchronized
方法,所以关于 synchronized
的任何讨论在大量多线程的环境中是适用的。
鉴于 Random
中的这条注释(如您所述) javadoc , 我会说你计划使用 ThreadLocal<SecureRandom>
是否合适:
Instances of
java.util.Random
are threadsafe. However, the concurrent use of the samejava.util.Random
instance across threads may encounter contention and consequent poor performance. Consider instead usingThreadLocalRandom
in multithreaded designs.
正如您自己总结的那样,您的实现不会出现内存泄漏问题。尤其如此,因为存储在 ThreadLocal
中的对象来自系统 ClassLoader,而不是您的 webapp 的 ClassLoader。
关于java - 最小化多线程环境中的 SecureRandom 性能问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34340372/
我想咨询一些关于 Java 中 SecureRandom 的常见神话、安全与性能权衡的问题。 在网上查了一段时间,整理了以下资料。我希望这里的人能帮助我确认我得到了什么,并希望对实际选择实现的内容有一
我正在尝试使用 SecureRandom 生成随机值,特别是它对流的支持。理想情况下,值应该在恒定的基础上生成,因此流可以是无限的: SecureRandom secureRandom = new S
我想知道 Docker 容器中的随机(或伪随机)序列生成,但遇到了另一个有趣的行为。 直接从 /dev/urandom 读取 8000000 字节并使用 ENT 测试结果时给出以下内容: Entrop
我需要生成加密的安全、随机和唯一字符串,每个字符串都将用作实际上是访问 token 。为此,我计划使用 Java 的 SecureRandom 类。但是,我不确定 SecureRandom 能否保证唯
我有一个使用 SHA1PRNG 的 SecureRandom 生成器: SecureRandom rnd = SecureRandom.getInstance("SHA1PRNG"); 让我们假设这个
我在我的安卓客户端和服务器(Servlet)中得到了一个随机数。我在客户端和服务器中使用相同的 SecureRandom 算法(“SHA1PRNG”)。两者的种子值相同。但是我得到的输出数字在客户端和
我有一个需要加盐密码的应用程序。为了生成盐,我决定使用 SecureRandom。当我在我的 Windows 机器上时,一切都很好。然后我尝试在基于 Linux 的机器 (Centos 5) 上运行我
这是生成密码盐的正确方法吗? SecureRandom random = new SecureRandom(); byte[] salt = random.genera
我正在尝试按照以下方式打乱整数数组, 来自http://en.wikipedia.org/wiki/Fisher-Yates_shuffle , “当 Fisher–Yates shuffle 与伪随
在调查为什么我的 Ubuntu 15 上的 tomcat 8 服务器在启动时没有响应时,事实证明它花费了大量时间来尝试创建 SecureRandom 的实例。为什么会这样以及如何解决? May 19,
我们有一个生成随机临时密码的业务需求。根据用例,此类调用的数量预计非常低(约 400 个调用/天)。根据互联网上的各种建议以及阅读了许多关于 SO 的类似帖子后,我们决定使用 java.securit
尽管在阅读了很多关于 SecureRandom 的文章之后,我还是对 Java 中 SecureRandom 安全 API 的使用产生了疑问。在下面的示例中。 public class SecureR
我找到了很多关于 SecureRandom 的例子看起来像这样的类: Random random = new SecureRandom(); int randomInteger = random.ne
假设你做简单的事情: public class Main { public static void main(String[] args) { long started = S
SecureRandom 线程安全吗?也就是初始化之后,能否依赖对下一个随机数的访问是线程安全的?检查源代码似乎表明它是,this bug report似乎表明它缺乏作为线程安全的文档是一个 java
我正在尝试使用 SecureRandom 在我的 java 项目中生成随机数。但是对于如何为 SecureRandom 保留我的对象,我有点困惑。它应该是一个 static 类成员。我不打算从外面打电
我有一个使用 SecureRandom 实例并获取下一个随机数的类。 让我们说这个例子是: public class ExampleClass() { public void method()
关于SecureRandom,我有些不明白。以这里的代码为例: import java.security.SecureRandom; import java.math.BigInteger; publ
来自 java.util.Random 的 java.security.SecureRandom 种子是否会削弱加密强随机数生成器? 我看到这段代码,想知道为什么要以这种特定的方式完成。 random
在我的群组实体中,我生成一个随 secret 钥,用作“共享代码”:人们可以使用此代码邀请并找到彼此。以下是我的使用方法: public function __construct() { //
我是一名优秀的程序员,十分优秀!