基于相同逻辑生成的两组SHA1密钥对相等性校验不通过,原因是什么?
基于相同逻辑生成的两组SHA1密钥对相等性校验不通过,原因是什么?
看起来你是想通过固定的keySeed重复生成相同的密钥对,但实际校验没通过对吧?我来帮你梳理下最可能的几个原因:
SecureRandom没有用keySeed初始化:这是最常见的问题!你现在只是获取了
SHA1PRNG实例,但没有把生成好的keySeed传给它做初始化。默认情况下,SecureRandom会从系统的随机熵源(比如系统硬件随机数、进程状态等)自动生成初始种子,两次运行的初始状态完全不同,自然生成的密钥对也不一样。你需要在获取实例后立刻调用random.setSeed(keySeed);,强制让随机生成器基于你指定的种子启动。代码截断部分可能存在额外随机逻辑:你的代码在
throw new RuntimeExcep...这里截断了,会不会在后续的密钥对生成逻辑里,还引入了其他随机因素?比如生成密钥时有没有传入其他未固定的参数,或者对keySeed做了额外的动态处理?这也会导致两次生成的结果不一致。SHA1PRNG的JVM实现差异(小概率):不同厂商的JVM(比如Oracle JDK和OpenJDK)对
SHA1PRNG的实现细节可能略有不同,但如果是在同一个环境下测试,只要种子正确设置,这个问题基本不会出现。
你的核心代码片段:
var arg1="65cfa78989387ca19f18d1d54af0d45dfb8fd9ee"; var arg2="783C82C2E6394A329A8149564E1B6AB74AA70FBD"; var keySeed=Sovereignty.bitwiseXor(Sovereignty.hexStringToByteArray(arg1),Sovereignty.hexStringToByteArray(arg2)); SecureRandom random; try{ random=SecureRandom.getInstance("SHA1PRNG"); }catch(NoSuchAlgorithmException x){ throw new RuntimeExcep...
给你一个修正后的关键代码示例,补上种子初始化步骤:
var arg1="65cfa78989387ca19f18d1d54af0d45dfb8fd9ee"; var arg2="783C82C2E6394A329A8149564E1B6AB74AA70FBD"; var keySeed=Sovereignty.bitwiseXor(Sovereignty.hexStringToByteArray(arg1),Sovereignty.hexStringToByteArray(arg2)); SecureRandom random; try{ random=SecureRandom.getInstance("SHA1PRNG"); random.setSeed(keySeed); // 必须加上这一步,固定初始种子 }catch(NoSuchAlgorithmException x){ throw new RuntimeException("Failed to get SHA1PRNG instance", x); } // 后续用这个random实例生成密钥对,两次运行应该就能得到相同的结果了
备注:内容来源于stack exchange,提问作者8483315
相关产品推荐
相关产品推荐

