Closed Moohee-yll closed 3 years ago
thx🌹,我对代码和接口做了微调,同时补了单测,具体可见 README:
你好,这里sm.generateKeyPairHex
输入较短的数会生成较小的私钥值,开发者可能在不知情的情况下使用非密码学安全的随机数,我觉得有必要在文档中指出需要至少长度为32的Int8Array(32 * 8 = 256 bits)。
此外,hex字符串作为输入时,由于直接使用了BigInteger构造方法,存在多个字符串生成同样BigInteger的情况,如:
bigInteger1 = new BigInteger('123') // => BigInteger { '0': 123, t: 1, s: 0 }
bigInteger2 = new BigInteger('11d') // => BigInteger { '0': 123, t: 1, s: 0 }
并且对字符串的长度也不能很好把控,难以判断多长的字符串能生成足够长的私钥(这里测试需要77位有效的AlphaNum才能生成较大的私钥值)。因此在文档中需要让sm库的使用者注意到,自定义随机数可能存在的隐患,并给出相应建议。
你好,这里
sm.generateKeyPairHex
输入较短的数会生成较小的私钥值,开发者可能在不知情的情况下使用非密码学安全的随机数,我觉得有必要在文档中指出需要至少长度为32的Int8Array(32 * 8 = 256 bits)。此外,hex字符串作为输入时,由于直接使用了BigInteger构造方法,存在多个字符串生成同样BigInteger的情况,如:
bigInteger1 = new BigInteger('123') // => BigInteger { '0': 123, t: 1, s: 0 } bigInteger2 = new BigInteger('11d') // => BigInteger { '0': 123, t: 1, s: 0 }
并且对字符串的长度也不能很好把控,难以判断多长的字符串能生成足够长的私钥(这里测试需要77位有效的AlphaNum才能生成较大的私钥值)。因此在文档中需要让sm库的使用者注意到,自定义随机数可能存在的隐患,并给出相应建议。
嗯,已补充简要说明,默认仍然使用 jsbn 里的随机数生成器,不过 generateKeyPairHex 的入参改成可直接透传到 BigInteger 构造器,用户可完全控制随机数 bigInt 实例的构造方式。
对sm2建议的两个features:
jsbn
中的伪随机数生成器为RC4,这在RFC4252和RFC7465中已被指出不安全。可以让开发人员通过其他的方式生成密码学安全的随机数,并传入sm2.generateKeyPairHex
来生成相应的公私钥对。