- 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/
对于一个简单的聊天程序,我使用了一个通过 boost::python 包装的 c 库。 使用 PyQT 编写了一个简单的 GUI。接收消息是通过阻塞调用完成的lib说。对于独立刷新的 GUI,通信部分
当我创建以下内容时,我试图创建一个可以被异常终止的线程类(因为我试图让线程等待一个事件): import sys class testThread(threading.Thread): def
我正在用 Haskell 编写服务器,我想在客户端断开连接后显式关闭它们。当我调用 hClose ,线程将阻塞,直到客户端关闭其一侧的句柄。有没有办法让它在不阻塞的情况下关闭? 提前致谢! 最佳答案
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: garbage collection Operation 我有几个相关问题。 1.JAVA垃圾收集器运行时,是否占用
我有一个 Angular 函数,它在初始 URL 中查找“列表”参数,如果找到,就会出去获取信息。否则我想获得地理位置。如果存在 URL 参数,我不想获取地理位置。我使用的术语是否正确? constr
我读了很多关于锁定数据库、表和行的文章,但我想要较低的锁定,比如只锁定“操作”,我不知道如何调用它,假设我在 php 中有函数: function update_table() { //que
在我的多线程 mfc 应用程序中,m_view->SetScrollPos 处于阻塞状态并且所有应用程序都被卡住。 View 是在另一个线程中创建的,这是这种行为的原因吗? //SetScrollPo
FreeSwitch 软件在几天内运行良好(~3 - 5 天),然后由于 FreeSwitch 被阻止,新的来电请求被接受!!正在进行的调用继续他们的 session ,他们的调用似乎没有受到影响,但
我有一组按钮,当鼠标悬停在这些按钮上时,它们会改变颜色。这些的 CSS 以这种方式运行: #navsite ul li button { height: 60px; width: 60
由于某些原因,当我调用 WSARecvFrom 时,该函数在接收到某些内容之前不会返回。 _socket = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, N
我了解一些关于 Oracle 阻塞的知识——更新如何阻塞其他更新直到事务完成,写入者如何不阻塞读取者等。 我理解悲观和乐观锁定的概念,以及有关丢失更新等典型银行教科书示例。 我也理解 JDBC 事务隔
在两个代码点之间,我是否可以判断进程是否已被内核抢占,或者更确切地说,当时是否有任何其他代码在同一处理器上运行? //Point A some_type capture = some_capture(
这是我在 Oracle 的面试问题。 有一个堆栈,即使堆栈已满,push 操作也应该等到它完成,即使堆栈为空,pop 操作也应该等到它完成。 我们怎样才能做到这一点? 我的回答 让一个线程做push
我想知道是否有人可以告诉我如何有效地使用循环平铺/循环阻塞进行大型密集矩阵乘法。我正在用 1000x1000 矩阵做C = AB。我按照 Wikipedia 上的循环平铺示例进行操作,但使用平铺得到的
我正在阅读有关绿色线程的内容,并且能够理解这些线程是由 VM 或在运行时创建的,而不是由操作系统创建的,但我无法理解以下语句 When a green thread executes a blocki
我正在创建的 JavaScript API 具有以下结构: var engine = new Engine({ engineName: "TestEngine", engineHost
ChildWindow 是一个模态窗口,但它不会阻塞。有没有办法让它阻塞?我基本上想要一个 ShowDialog() 方法,该方法将调用 ChildWindow.Show() 但在用户关闭 Child
我需要一些关于如何调试 10.6 版本下的 Cocoa 并发问题的指导。我正在将“for”循环转换为使用 NSOperations,但大多数时候,代码只是在循环的某个时刻卡住。我可以在控制台中看到 N
我正在使用 ReportViewer 控件和自定义打印作业工作流程,这给我带来了一些问题。我的代码看起来有点像这样: ids.ForEach(delegate(Guid? guid)
我有以下成功复制文件的代码。但是,它有两个问题: progressBar.setValue() 之后的 System.out.println() 不会打印 0 到 100 之间的间隔(仅打印“0”直到
我是一名优秀的程序员,十分优秀!