- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
通过论坛阅读似乎 SecureRandom
是线程安全的,但由于争用它在多线程系统中挣扎,请参阅 Is SecureRandom thread safe? .初始化一个新的 SecureRandom
也是一项昂贵的操作。提高性能的一个建议是使用 ThreadLocalRandom .
所以我改变了我的代码:
SecureRandom randomSecureRandom = SecureRandom.getInstance("SHA1PRNG");
到:
private final ThreadLocalRandom randomThreadLocal = ThreadLocalRandom.current();
我做了一些测试 - 运行 100 次以加密 10000 个字符串值,我可以看到明显的改进。
**With ThreadLocalRandom**
Thread #18New encryption service took on average: 66.44ms.
Thread #17New encryption service took on average: 64.79ms.
Thread #14New encryption service took on average: 70.77ms.
Thread #13New encryption service took on average: 72.33ms.
Thread #19New encryption service took on average: 73.42ms.
Thread #15New encryption service took on average: 74.21ms.
Thread #11New encryption service took on average: 76.79ms.
Thread #16New encryption service took on average: 78.72ms.
Thread #12New encryption service took on average: 78.95ms.
Thread #20New encryption service took on average: 78.99ms.
**With SecureRandom**
Thread #19New encryption service took on average: 87.26ms.
Thread #18New encryption service took on average: 93.65ms.
Thread #13New encryption service took on average: 93.1ms.
Thread #15New encryption service took on average: 95.81ms.
Thread #16New encryption service took on average: 96.9ms.
Thread #11New encryption service took on average: 97.0ms.
Thread #20New encryption service took on average: 94.93ms.
Thread #17New encryption service took on average: 96.63ms.
Thread #12New encryption service took on average: 97.41ms.
Thread #14New encryption service took on average: 99.08ms.
似乎我确实提高了这里的速度,但是我降低了安全性,因为 ThreadLocalRandom 似乎不是加密安全的:
* <p>Instances of {@code ThreadLocalRandom} are not cryptographically
* secure. Consider instead using {@link java.security.SecureRandom}
* in security-sensitive applications
我的问题是 - 有没有办法创建密码安全的随机数,它是线程安全的并且在多线程系统中表现良好?
还有一个问题涉及此主题,但答案是建议从 SecureRandom
-> ThreadLocalRandom
进行相同的转换,这不是加密安全的,请参阅 Minimizing SecureRandom performance problems in multithreaded environment? .
最佳答案
SecureRandom
实现比 ThreadLocalRandom
慢得多。这与线程安全无关。
ThreadLocalRandom
生成下一个随机数的算法涉及的数学运算很少,容易破解。事实上,单个 nextLong 操作返回的结果足以确定该生成器生成的所有 future 和过去的数字,请参阅 https://jazzy.id.au/2010/09/20/cracking_random_number_generators_part_1.html如果您对细节感兴趣。
另一方面,您选择的提供商的 SecureRandom
使用 SHA1 生成随机数。 SHA1 的计算成本很高,因此性能比 ThreadLocalRandom
差。这是设计使然 - 计算复杂性是使 SHA1 难以逆转和种子难以猜测的因素之一。
为了比较性能,我使用两个生成器在单个线程中生成了 100M 个随机数。 ThreadLocalRandom
耗时 95 毫秒,SecureRandom
耗时 41 秒。
编辑以解决线程性能问题:
您可以为每个线程创建一个 SecureRandom
实例。它将在第一次使用从静态(共享/同步)实例中获取的数据时进行初始化,但后续操作将是线程本地的。我使用共享和专用 SecureRandom
实例测量了 4 个线程的性能。每个线程产生100M随机数;专用实例耗时 30 秒,共享实例耗时 1 分 54 秒。
关于java - 安全随机 : thread safe without contention and still cryptographically secure?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42760967/
关闭。这个问题需要更多 focused .它目前不接受答案。 想要改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 4 年前。 Improve this q
我一直被告知在给密码加盐时应该使用 openssl_random_pseudo_bytes。 但我真正想知道的是,是什么让它在密码学上是安全的。 rand 之间的内部区别是什么? , mt_rand和
这是一个场景:。服务器键(通常为40个字符)Player1键(通常为20个字符)(选择为当前游戏的第一个玩家)Player2键(通常为20个字符)(选择为当前游戏的第二个玩家)Player3键(通常为
当我尝试在 ASP.NET MVC 应用程序上获取我的主页时出现此异常。 [CryptographicException: Error occurred during a cryptographic
因此,我正在考虑使用哪个加密 C++ 库(我已经弄清楚如何在 C# 中执行等效操作)来验证许可文件签名哈希。 阅读 Microsoft 的 CNG 文档似乎无法从字节流生成代码中的 ECDSA key
我的计算机上安装了 OpenJDK 9,我正在尝试安装 Eclipse。但是,每次启动安装程序时都会出现错误: Internal Error: Cannot initialize cryptograp
几天前,在 Google Play 管理中心的“APK 预发布报告”中,它开始标记我 Unsafe encryption Detected in APK ??? Your app contains u
我尝试启动 Weblogic,但出现以下异常: There are 1 nested errors: oracle.security.jps.JpsException: oracle.security
我有一个用 openJDK (Amazon Correto 11) 和 openJFX 编写的应用程序。 当我在本地运行应用程序时 - 一切正常。但是当我从网络共享执行应用程序时出现异常: java.
我需要获得少量“加密良好”的随机字节。 (在我的例子中是 8 个字节。)是否有任何 Windows API? 附言。如果这些 API 向后兼容 Windows XP 就好了。但如果没有,它仍然可以工作
我不需要它太安全。连md5这种一般坏掉的也比我需要的安全(只要2分钟内不能发现碰撞,应该100%没问题)。 我需要它来制作我们本周末将在黑客马拉松中制作的视频游戏。我们有一个模拟游戏核心部分的服务器,
通过论坛阅读似乎 SecureRandom 是线程安全的,但由于争用它在多线程系统中挣扎,请参阅 Is SecureRandom thread safe? .初始化一个新的 SecureRandom
我已经将我的网站上传到虚拟主机,但出现了这个错误; '加密操作期间发生错误。'。 我做了一些研究,似乎经过验证的 cookie 绑定(bind)到 MachineKey(使用 webhost 时有所不
所以我启用了这个组策略,当我第一次尝试编译我的解决方案时,我收到了这个错误。有趣的是,我只在一个地方使用加密函数,但我看到的是我所有的 Silverlight ResourceDictionary 文
我已将我的项目从 v2.1 升级到 asp.net core v2.2,一切都用于正常工作。在下面显示的代码中,我正在尝试使用 IdentityServer4(v2.3.2) 初始化 RSA key
我刚刚更新并立即收到此错误: "error: A cryptographic verification failure has occurred." 有什么想法吗? 编辑:我有 iOS 10 最佳答案
Google 正试图逐步停止使用使用 SHA1 散列算法的 SSL 证书。因此,我想创建一个符合 SHA2 的自签名证书。我知道 SHA 是一种哈希算法,而 RSA 是一种加密算法。我找到了以下用于生
我是一名优秀的程序员,十分优秀!