使用以下算法生成的密码有多安全?
a_z = ('a'..'z').to_a
Array.new(10).map{|_| a_z.sample}.join
这样的密码在技术上并不安全,因为作为随机数生成器的Mersenne TwisterArray#sample
算法理论上可以被破解。采样的每个字母都为数字生成器的内部状态提供了线索,并且了解足够多的信息(可能在您的方案中顺序生成大约 80 个密码)就足以开始预测未来密码的内容。
在实践中,这对于黑客来说是非常难以利用的,因为他们需要访问相当多的密码,这些密码都是在同一进程中生成的并且知道顺序,然后才能开始可靠地预测密码。
但是,您可以通过使用加密随机数生成器来避免这个潜在的问题。Ruby 有一个作为标准SecureRandom
。SecureRandom 无法连接到Array#sample
,与您的等效代码可能是:
Array.new(10) { (97 + SecureRandom.random_number(26)).chr }.join
它看起来不那么优雅,但更难破解。
增加密码的长度和可用字符的选择也会使密码更难暴力猜测(通过尝试所有可能的组合),但这不是使用方法固有的问题Array#sample
- 你可以增加数字的字符。
您的代码只能生成26^8
不同的密码。我认为这不是很安全。
SecureRandom.urlsafe_base64
如果您必须生成随机密码,我建议使用 Ruby (顺便说一句Devise::friendly_token
,使用该库)。我建议使用更长的密码。
require 'securerandom'
SecureRandom.urlsafe_base64
#=> "GL3tna7eQFpu1JaPnxIoyA"
该示例可以生成64^22
不同的字符串。