首页 > 解决方案 > 使用 SecureRandom.base64 在 Rails 中生成安全令牌的推荐数字是多少?

问题描述

我正在使用SecureRandom.base64(16),但我不确定这是否足够。我也不确定到底是什么16意思。我会做出一个明智的猜测,那就是生成的随机字符的数量,但一些测试证明了这一点。

例如

SecureRandom.base64(16)
=> "Hqncn1pVVHzoBJkFNpat4g==" # 22 characters, plus 2 equals signs at the end


标签: ruby-on-railsruby

解决方案


您的答案可以在ruby​​ 文档中找到。让我引用:

SecureRandom.base64生成一个随机的 base64 字符串。

参数 n 指定要生成的随机数的长度(以字节为单位)。结果字符串的长度约为 n 的 4/3。

如果 n 未指定或为 nil,则假定为 16。未来可能会更大。

结果可能包含 AZ、az、0-9、“+”、“/”和“=”。

require 'securerandom'

SecureRandom.base64 #=> "/2BuBuLf3+WfSKyQbRcc/A=="
SecureRandom.base64 #=> "6BbW0pxO0YENxn38HMUbcQ=="

如果安全随机数生成器不可用,则会引发 NotImplementedError。

有关 base64 的定义,请参阅 RFC 3548。

所以你会看到这n是你的随机数将拥有的字节数。输出字符串中的不同长度来自将该数字转换为 base64。base64 编码需要比整数更多的字节来存储相同的信息。

如果n=16足够,取决于您的具体用例。您可能想研究产生冲突的可能性(产生相同输出的两个随机数生成)以及导致应用程序风险的可能性有多大。


推荐阅读