Создайте программу, которая запрашивает пароль, не показывая его в коде - PullRequest
0 голосов
/ 05 мая 2019

Я хочу написать программу на Ruby, которая может запрашивать пароль и проверять, соответствует ли введенный пароль действительному паролю.

Дело в том, что я мог бы написать функцию в ruby, которая могла бы проверить, является ли введенный пароль хорошим, например:

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

Но тогда, если кто-то смотрит на файл, пароль будет раскрыт.

Так как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 05 мая 2019

Хешируйте пароль и сохраняйте хеш в виде строки.

Когда пользователь вводит пароль, хэшируйте его и сравнивайте с хешированной строкой. Если это соответствует, это правильно, иначе это не так.

Это безопасно, поскольку вы не можете получить исходный пароль из хешированной строки.

В этом примере используется 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

Edit:

Как предложил @ Jörg W Mittag, использование Argon2 является лучшим вариантом с точки зрения безопасности, поскольку на самом деле оно предназначено для хеширования пароля.

Подробнее об Argon2:

https://github.com/technion/ruby-argon2

-

Что такое хеширование?

https://en.wikipedia.org/wiki/Hash_function

-

Хеширование в ruby:

http://www.informit.com/articles/article.aspx?p=2314083&seqNum=35

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

1 голос
/ 05 мая 2019

Вы можете использовать гем 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
...