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