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