SecureRandom
扫描网络接口的默认实现是系统熵的附加来源。为了避免这种情况,您需要注册一个
java.security.Provider包含的不同实现的自定义
SecureRandomSpi。
幸运的是,用于Windows的JDK已经具有
SecureRandomSpi依赖于Microsoft Crypto API
的合适的实现:
sun.security.mscapi.PRNG。尽管这是非公开的API,但是从1.6到9的所有版本的OpenJDK和Oracle
JDK中都存在该类,并且仍然可以使用后备。
有两种方法可以将MS Crypto PRNG注册为默认的SecureRandom算法。
1. 从应用程序内部
WindowsSecureRandom.register()开始调用。
import java.security.Provider;import java.security.Security;public class WindowsSecureRandom extends Provider { private static final String MSCAPI = "sun.security.mscapi.PRNG"; private WindowsSecureRandom() { super("WindowsSecureRandom Provider", 1.0, null); putService(new Service(this, "SecureRandom", "Windows-PRNG", MSCAPI, null, null)); } public static void register() { if (System.getProperty("os.name").contains("Windows")) { try { Class.forName(MSCAPI); Security.insertProviderAt(new WindowsSecureRandom(), 1); } catch (ClassNotFoundException e) { // Fallback to default implementation } } }}2. 通过重新排序
%JAVA_HOME%jrelibsecurityjava.security文件中的提供程序列表。
security.provider.1=sun.security.mscapi.SunMSCAPI <<<--- make it the first providersecurity.provider.2=sun.security.provider.Sunsecurity.provider.3=sun.security.rsa.SunRsaSignsecurity.provider.4=sun.security.ec.SunECsecurity.provider.5=com.sun.net.ssl.internal.ssl.Provider...
我已经验证,解决方案
SeedGenerator和
NetworkInterface类都不会再加载。



