2013-05-22 26 views

回答

1

这样的密码是不是技术上的加密安全,因为在Array#sample作为随机数发生器Mersenne Twister算法在理论上被黑客攻击。每个被抽样的字母都会给出号码生成器的内部状态的线索,并且知道足够多的信息(可能在您的方案中按顺序生成大约80个密码)足以开始预测未来密码的内容。

实际上,这对于黑客来说很难利用,因为他们需要访问在同一进程中生成的相当多的密码,并知道序列,然后才能开始可靠地预测密码。

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

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

它看起来并不优雅,但它更难以破解。

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

1

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

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

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

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

相关问题