wechat-miniprogram / sm-crypto

miniprogram sm crypto library
MIT License
441 stars 88 forks source link

feature: could provide random values for sm2 key gen & pk point verif… #22

Closed Moohee-yll closed 3 years ago

Moohee-yll commented 3 years ago

对sm2建议的两个features:

  1. jsbn中的伪随机数生成器为RC4,这在RFC4252RFC7465中已被指出不安全。可以让开发人员通过其他的方式生成密码学安全的随机数,并传入sm2.generateKeyPairHex来生成相应的公私钥对。
  2. 在一些应用(如ECDH)中,公钥需要被验证是否在椭圆曲线上,因此该库应该提供这样的接口。
JuneAndGreen commented 3 years ago

thx🌹,我对代码和接口做了微调,同时补了单测,具体可见 README:

image

Moohee-yll commented 3 years ago

你好,这里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库的使用者注意到,自定义随机数可能存在的隐患,并给出相应建议。

JuneAndGreen commented 3 years ago

你好,这里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 实例的构造方式。