2013-05-22 61 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不同的字符串。

相關問題