创建一个要求输入密码而不在代码中显示的程序

时间:2019-05-05 16:57:25

标签: ruby security password-protection privacy

我想用Ruby编写一个程序,该程序可以要求输入密码并验证输入的密码是否与有效密码相对应。

问题是,我可以用ruby编写一个函数,该函数可以检查输入的密码是否像下面这样好:

def is_valid?(password)
  password == "my_password"
end

但是,如果有人在查看文件,密码将被泄露。

那我该怎么做?

2 个答案:

答案 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

https://richonrails.com/articles/hashing-data-in-ruby

答案 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