1

使用以下算法生成的密码有多安全?

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

2 回答 2

2

这样的密码在技术上并不安全,因为作为随机数生成器的Mersenne TwisterArray#sample算法理论上可以被破解。采样的每个字母都为数字生成器的内部状态提供了线索,并且了解足够多的信息(可能在您的方案中顺序生成大约 80 个密码)就足以开始预测未来密码的内容。

在实践中,这对于黑客来说是非常难以利用的,因为他们需要访问相当多的密码,这些密码都是在同一进程中生成的并且知道顺序,然后才能开始可靠地预测密码。

但是,您可以通过使用加密随机数生成器来避免这个潜在的问题。Ruby 有一个作为标准SecureRandom。SecureRandom 无法连接到Array#sample,与您的等效代码可能是:

Array.new(10) { (97 + SecureRandom.random_number(26)).chr }.join

它看起来不那么优雅,但更难破解。

增加密码的长度和可用字符的选择也会使密码更难暴力猜测(通过尝试所有可能的组合),但这不是使用方法固有的问题Array#sample- 你可以增加数字的字符。

于 2015-04-18T07:21:47.953 回答
1

您的代码只能生成26^8不同的密码。我认为这不是很安全。

SecureRandom.urlsafe_base64如果您必须生成随机密码,我建议使用 Ruby (顺便说一句Devise::friendly_token,使用该库)。我建议使用更长的密码。

require 'securerandom'
SecureRandom.urlsafe_base64
#=> "GL3tna7eQFpu1JaPnxIoyA"

该示例可以生成64^22不同的字符串。

于 2015-04-18T07:23:29.100 回答