使用以下算法生成密碼的安全性如何?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