瞎扯淡 使用 SecureRandom 你不必注意这个

mizuhashi for Shopper+ · 发布于 2016年08月18日 · 最后由 lgn21st 回复于 2016年08月18日 · 1002 次阅读
23529

最近用到secure random来生成session token,稍微调研了一下这个lib的负面新闻,然后找到了:

https://bugs.ruby-lang.org/issues/9569

大意是secure random使用openssl生成随机数不够好,敦促core team换用/dev/urandom实现。其中一个重要的理由是:openssl random number generator不是fork safe的,也就是在unicorn这类fork之后的进程里会产生重复随机数。

而帖子中有人提到这个issue已经被ruby处理过了,我查找到了 https://bugs.ruby-lang.org/issues/4579 ,原来SecureRandom在生成随机数之前会检查一下pid,如果和之前存下的不吻合,就意味着fork了新进程,要把新的pid作为熵引入到openssl里。

真可靠啊...

相比之下,PHP就没这么幸运了: https://github.com/ramsey/uuid/issues/80

这哥们在生产环境生成1M组uuidv4,就遇到了几百组重复.....而且这是去年八月的issue,今年二月查明.....


实际中我用了个256bit的随机hex做token,比uuidv4的122bit大不少,但是感觉用随机数还是有出问题的可能,应该考虑换用uuid v1。

v1的话虽然有个uuid gem,但也不知道可不可靠,毕竟还挂着个collision的issue...

共收到 2 条回复
11524

感觉还是得注意啊,检查pid什么的在一台机子上还好,要是不止跑一个instance的话不知道会如何

3

关注随机数生成质量,赞一记,系统安全方面的基石。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册