Шифрование-дешифрование в Rails - PullRequest
6 голосов
/ 26 апреля 2010

Я использую require 'digest/sha1' для шифрования своего пароля и сохранения в базе данных. Во время входа в систему я аутентифицируюсь, сопоставляя зашифрованный пароль, сохраненный в базе данных, и снова зашифровываю одноразовый ввод в поле пароля. На данный момент все работает нормально, но теперь я хочу сделать функцию «Забыли пароль». Для этого мне нужно расшифровать пароль, который сохраняется в базе данных, чтобы найти оригинальный. Как расшифровать, используя digest/sha1? Или кто-нибудь знает какой-либо алгоритм, который также поддерживает шифрование и дешифрование?

Я использую ruby ​​на рельсах, поэтому мне нужен способ Ruby для этого.

Ответы [ 5 ]

10 голосов
/ 26 апреля 2010

SHA1 - это односторонняя функция, которую нельзя изменить.

Это может быть интересно для сброса пароля: http://www.binarylogic.com/2008/11/16/tutorial-reset-passwords-with-authlogic/

Если вы хотите сделать шифрование / дешифрование, вам следует использовать что-то вроде AES . Однако, как только вы начнете использовать шифрование / дешифрование, вам также придется начать беспокоиться об управлении ключами.

Что касается вашего комментария к OP ниже - если вы собираетесь хранить информацию CC, я бы посоветовал вам обратиться к специалисту по безопасности, который знает о крипто, управлении ключами и т. Д., А также понимает соответствующие правовые и нормативные аспекты.

6 голосов
/ 26 апреля 2010

не шифровать пароль. вместо этого хранится хеш пароля (лучше с солью).

до забыть пароль обычно означает (повторную) аутентификацию через другой канал, например, уведомление по электронной почте о сбросе пароля.

смотрите http://railscasts.com/episodes/209-introducing-devise, если вам нужно что-то уже готовое.

изменить: если вам действительно нужно шифрование, Google "openssl ruby"

никогда не бывает простого решения для безопасной работы. насколько хорошо ваша реализация определяется ссылкой слабость .

Итак, я рекомендую не рассчитывать на короткий ответ SO; -)

2 голосов
/ 26 апреля 2010

Как объяснил Гораций Хо, вы никогда не должны шифровать пароль, а всегда хранить зашифрованную соль.

Тем не менее, прекрасно шифровать другие виды данных, например конфиденциальную информацию. Encryptor это простая, но мощная оболочка для OpenSSL. Он предоставляет возможность шифровать / дешифровать атрибуты в любом классе.

1 голос
/ 01 февраля 2012

Для двустороннего шифрования в других полях базы данных проверьте attr_enrypted gem

https://github.com/shuber/attr_encrypted

Но, как уже упоминали другие, вы не захотите делать это с паролем. Пароли должны храниться одним способом. Для работы с забытым паролем вы обычно отправляете им по электронной почте непонятный URL, который позволит им выбрать новый пароль.

Здесь есть пример: http://railscasts.com/episodes/274-remember-me-reset-password?view=asciicast

1 голос
/ 26 апреля 2010

Посмотрите на самоцвет ezcrypto: http://ezcrypto.rubyforge.org/

Там также есть камень склепа, посмотрите на Blowfish: http://crypt.rubyforge.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...