我想用Ruby编写一个程序,该程序可以要求输入密码并验证输入的密码是否与有效密码相对应。
问题是,我可以用ruby编写一个函数,该函数可以检查输入的密码是否像下面这样好:
def is_valid?(password)
password == "my_password"
end
但是,如果有人在查看文件,密码将被泄露。
那我该怎么做?
答案 0 :(得分:2)
哈希密码并将哈希存储为字符串。
当用户键入密码时,对其进行哈希处理并将其与哈希字符串进行比较。如果匹配,则正确,否则不正确。
这是安全的,因为您无法从哈希字符串中获取原始密码。
此示例使用SHA-512,因为它不能被强行使用,但它是安全的。
def is_valid?(password)
hash = Digest::SHA512.hexdigest(password)
mypassword == #the hash of your password
if hash == mypassword
return true
else
return false
end
编辑:
正如@JörgW Mittag所建议的那样,就安全性而言,使用Argon2是更好的选择,因为它实际上是用于密码哈希的。
有关Argon2的更多信息:
https://github.com/technion/ruby-argon2
-
什么是哈希?
https://en.wikipedia.org/wiki/Hash_function
-
哈希在红宝石中:
http://www.informit.com/articles/article.aspx?p=2314083&seqNum=35
答案 1 :(得分:1)
您可以使用bcrypt宝石。
从他们的文档中摘录:
require 'bcrypt'
my_password = BCrypt::Password.create("my password")
#=> "$2a$12$K0ByB.6YI2/OYrB4fQOYLe6Tv0datUVf6VZ/2Jzwm879BW5K1cHey"
my_password == "my password" #=> true
my_password == "not my password" #=> false
my_password = BCrypt::Password.new("$2a$12$K0ByB.6YI2/OYrB4fQOYLe6Tv0datUVf6VZ/2Jzwm879BW5K1cHey")
my_password == "my password" #=> true
my_password == "not my password" #=> false