- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想咨询一些关于 Java 中 SecureRandom 的常见神话、安全与性能权衡的问题。
在网上查了一段时间,整理了以下资料。我希望这里的人能帮助我确认我得到了什么,并希望对实际选择实现的内容有一些想法。
基本上这里有一些关于 SecureRandom 的最受欢迎和最详尽的文章:
正确使用 Java 的 SecureRandom: https://www.synopsys.com/blogs/software-security/proper-use-of-javas-securerandom/
使用 Java 的 SecureRandom 时的问题: https://www.synopsys.com/blogs/software-security/issues-when-using-java-securerandom/
使用 SecureRandom 类: http://moi.vonos.net/java/securerandom/
并且,Sun 官方“承认”了错误/混淆以及在 Java 8 中提出的发布: http://openjdk.java.net/jeps/123
现在 Java 8 已经出来了,老实说,我不确定这个问题实际修复得有多好,仅通过查看文档: http://docs.oracle.com/javase/8/docs/api/java/security/SecureRandom.html
所以毕竟,这就是我得到的(请帮我看看我是否对它们进行了排序):
像 Amit Sethi 这样的人建议使用指定的实例化,例如:SecureRandom sr3 = SecureRandom.getInstance("SHA1PRNG", "SUN"),实际上,Sun 告诉我们这最终总是从/dev/random(? ??),这意味着它可能会阻塞每个调用。与使用 new SecureRandom() 相反,除非调用 generateSeed() ,否则它将始终从/dev/urandom 读取。见
http://bugs.java.com/view_bug.do?bug_id=6202721
这是否意味着“new SecureRandom()”在当前 Java 中仍然是首选?我发现没有多少其他文档明确说明上述观点,所以我想知道这是否仍然正确?
现在,如果选择“new SecureRandom()”并将导致永不阻塞调用,那么我认为我应该为定期重新播种做些什么:
使 SecureRandom 成为类中的静态实例,并让另一个 Executor 线程定期对其调用 generateSeed(),因此即使调用被阻塞,它也不会影响我应用程序中的主请求处理线程。这听起来是个好方法吗?
非常感谢任何 Java 和加密专家在这里阐明这个问题。谢谢!
编辑:这里的另一个有用线程似乎支持我的猜测:https://bugs.openjdk.java.net/browse/JDK-4705093
最佳答案
编辑 :首先;如果 /dev/random
或 /dev/urandom
阻塞,首先尝试修复该特定问题是有意义的。下面的解决方案是关于尝试修复 Java 本身的 SecureRandom
,因此它不太依赖于那些特殊设备。
Make SecureRandom a static instance in the class and let another Executor thread periodically call generateSeed() on it, thus even though the call is blocking, it's not affecting my main request handling thread in my application. Does that sound like a good way doing it?
不,在这种情况下,您应该使用 nextBytes()
,因为内部调用 generateSeed()
使用种子信息的原始供应商。换句话说,您也可以创建一个单独的 SecureRandom
实例。请注意,只要您有一个具有足够高状态和良好支持算法的 SecureRandom
实例,就不需要经常重新播种(因为它不太可能创建循环)。如果您需要更高的熵,每次都生成一个新的随机类或使用使用 SecureRandom.getInstanceStrong()
检索的随机数.
使用默认的 new SecureRandom()
可能是最好的。通常,您应该始终为加密算法提供精确的算法名称(例如 “AES/CBC/PKCS5Padding”
),但对于安全的随机功能,最好让系统找出最佳算法。如果您想更改任何内容,请通过命令行结构进行更改,并确保 /dev/urandom
在 Unix 系统上可用。
如果您仍然遇到阻塞问题,请创建一个中央系统种子 SecureRandom
。使用 nextBytes()
创建新的种子 Material ,并使用 SecureRandom(byte[] seed)
将其提供给新的 SecureRandom
构造函数。仅当 new SecureRandom()
无法处理这种情况时才应使用此方法。
即使现在通过使用构造函数显式提供初始种子,构造函数本身也不能保证它仅用于为 RNG 播种。但是,可能确实是这种情况,因此不太可能阻止。 SecureRandom
is thread safe所以你不需要同步访问它。
使用新的 Java 8 SecureRandom.getInstanceStrong()
更有可能阻塞。我假设他们添加了以使默认实例成为非阻塞。 RSA key 对生成通常需要大量熵,因此返回的实例很可能确实使用对 /dev/random
的阻塞调用。
总而言之,在特殊情况下使用 SecureRandom
仍然相当麻烦。幸运的是,这只是数量非常有限的用例的问题。
关于java - SecureRandom.getInstance ("SHA1PRNG", "SUN") 总是阻塞而 new SecureRandom() 不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23024107/
我正在按照本教程创建 Singleton,所有者在以下方法时有评论 http://www.journaldev.com/1377/java-singleton-design-pattern-best-
package com.example.vivanksharma.firebase; import android.support.v7.app.AppCompatActivity; import a
自从首次引入它来替换 Date 以来,我一直在使用静态方法 Calendar.getInstance() 来获取新的 Calendar目的。我从来没有遇到过问题,但出于某种原因我只是想知道使用 Gre
我正在使用适用于 Windows 8 的 MVVM Light 第 4 版;它包括 SimpleIOC。在各种示例中,我有时会看到基于 SimpleIoc 请求对象的代码......有时它基于 Ser
我看过这个post关于注册泛型类型。 如何注册的示例: bind(new TypeLiteral>() {}).to((Class>) ResponseDal.class); 但是如何从注入(inj
我想在我的 unitTest 中从 Guice injector 注入(inject)一个实例。 我可以使用哪个微分器? 我知道构造函数参数中使用了@annotation机制 但是 junit 不允许
我正在使用静态实例对象来获取与应用程序中另一个 Activity 相关的数据。但这会导致内存泄漏。 public class ChartActivity extends AppCompatActivi
以前用过C#,我考虑过 Calendar cal = Calendar.getInstance(); 根据 GoF 成为单例方法 Singleton pattern (Wikipedia)我想知道如何
我很难找到以对性能最友好的方式使用单例类的正确方法。我有 3 种方法,也许有人可以向我解释最有效的方法: 1: public functionA() { SingletonClassA.get
最近我阅读了一些使用广泛遵循 getInstance() 方法的 C++ 代码: class S { private: int some_int = 0; public
许多公开可用的 Java API 似乎都使用 getInstance 来生成和返回对象。我很好奇为什么会这样——为什么不直接使用默认/参数化构造函数呢? 是否有关联的设计模式? 最佳答案 我建议阅读
我遇到过单例模式。我无法理解 singletonobj.getinstance().dosomething() //1st one 和 singletonobj.dosomething() //2nd
getInstance() 在 Java 中的作用是什么? 在我的研究过程中,我一直在读到 getInstance() 有助于实现单例设计模式(据我了解,这意味着整个程序中只有一个实例)。但是我不能只
Firebase Firestore 提供 getInstance()方法,它打开一个套接字(在应用程序执行的任何时候只有一个)并实例化 Firestore 客户端。 我想查询和存储数据,使用或不使用
我正在将一个表单组件放入 joomla.In 中,我将在其中放置一个文本框、一个编辑器和一个按钮。 我为此表单创建了 View 文件,并且组件已成功安装。但是当我单击以在前端显示此表单时,会出现如下错
我正在尝试跟踪人们是否从广告或其他地方找到了我的 Android 应用。所以我发现谷歌分析可以通过这个表单生成的精心构建的 url 来跟踪它: http://code.google.com/mobil
我观看了此视频(https://www.youtube.com/watch?v=idb6hOxlyb8),该视频是2013年8月上传的。它声称我们应该使用 ptor.get(url) 而不是 brow
创建 google-service.json 后运行示例时,应用在尝试在 SignInActivity 中获取数据库引用时崩溃 mDatabase = FirebaseDatabase.getInst
基于以下问题:Decimal point or decimal comma in Android我尝试获取设备中使用的小数点分隔符。我正在使用Kotlin,因此我的代码如下所示: import and
从 Fabric Crashlytics 迁移到 FirebaseCrashlytics SDK 后,我在另一个进程(不是主进程)上遇到了一些崩溃。 当在 Activity 中调用 FirebaseC
我是一名优秀的程序员,十分优秀!