我正在尝试在 Haskell 中使用此ECDSA实现,如果您查看第 15 行,您会看到 k 值使用randomRIO,它使用全局随机数生成器,其 获取器使用theStdGen ,它使用mkStdRNG,通过以下方式生成种子:
(挂钟上的当前秒数)* 12345 +(挂钟上的当前皮秒数)+(当前程序使用的 CPU 时间的皮秒数)
这足以签署价值数十亿美元的数据吗?
一般来说,答案是否定的。如果您正在考虑用例,唯一真正的选择是使用 FIPS 或通用标准认证的 HSM。FIPS 和 CC 评估必须是最近的日期,并且必须对 ECDSA 有效。应该只允许专家围绕它创建密钥管理协议。另一位专家应验证此协议和 HSM 的可用性。ECDSA 命名参数的选择应该是协议的一部分,不应掉以轻心。
现在为您的 Haskell RNG。您不应该使用当前的实现,因为随机数生成器肯定达不到标准。它可能使用不安全的种子(正如您可能已经发现的那样)并且似乎保持不充分的状态(任何说,使用整数,为什么不,在评论中不应该被信任)。我也没有看到任何散列或 HMAC 用于生成新的随机数或状态,所以我根本看不到这个实现是如何生成安全随机数的。
在网上快速浏览一下,更加坚定了我的怀疑:
http://tommd.wordpress.com/2010/09/02/a-better-foundation-for-random-values-in-haskell/
请注意在撰写本文时的实验标签:
http://hackage.haskell.org/package/crypto-random-api-0.2.0/docs/Crypto-Random-API.html
现在,如果您真的正在为价值数十亿美元的东西开发签约,请让自己成为经理并聘请专家(并听取专家的意见)。