ruby Array.sample是否可以安全地生成密码?

时间:2013-05-22 00:45:39

标签: ruby passwords

使用以下算法生成密码的安全性如何?

a_z = ('a'..'z').to_a
Array.new(10).map{|_| a_z.sample}.join

2 个答案:

答案 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个不同的字符串。