1.先说下问题:
由于我们的服务部署环境是两台服务器,在服务启动时生成RSA密钥对。这有一个问题:当两台机器分别启动时,生成了不同的密钥对。而当客户端需要用到RSA加解密的时候,链接可能会被负载到另一台机器上,造成解密失败,抛出异常。
2.看下之前的代码(第1版):
private static final KeyPair keyPair = initKey();
private static KeyPair initKey() {
try {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
SecureRandom random = new SecureRandom();
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "BC");
generator.initialize(512, random);
return generator.generateKeyPair();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
其中SecureRandom random = new SecureRandom();在生成强随机数时,没有指定任何参数。所以生成的随机数是无法控制的。通过查询API,发现另一个构造方法new SecureRandom(byte[] b),继而可以通过指定固定参数,返回固定的SecureRandom对象。故改出第2版:
private static final KeyPair keyPair = initKey();
private static KeyPair initKey() {