Хешированный и Соленый пароль не всегда одинаков - PullRequest
3 голосов
/ 29 апреля 2011

Я использую Apache Shiro в качестве своего уровня безопасности в своем приложении Spring и столкнулся с действительно странной ситуацией.

Во-первых, так настроена моя система безопасности. Когда пользователь регистрирует свой пароль, он хэшируется с помощью надежно сгенерированной случайной соли. Затем соль и хешированный пароль хранятся в моей БД. Все работает на 100%, когда они регистрируются и логин тоже работает, но потом проходит пара дней, и внезапно их хешированные пароли перестают соответствовать. Вот мой код:

import org.apache.shiro.codec.Base64;
import org.apache.shiro.crypto.hash.Sha256Hash;

public static void main(String[] args) {
        String plainPassword = "testing";
        String salt = "8AFTpriREtydSg39+37rQHNRyvZLuXqyXYgWXI55f1PbhbUQSeFGCLKsHpA6thZKs3uQeNNJHksqcV5oaNcr9lQiXMMyC8Duqr2aQaqyjLKpNMVlB69jJ7emNq0K6ccfBdv/O4JGT2U689LeNg6CqN+9kqW2GBgT2CIVOlapA34=";

        System.out.println(new Sha256Hash(plainPassword.toCharArray(), Base64.decode(salt), 1024).toBase64());
}

Полученный хешированный пароль:

b8VLt/eKV8F5kwDjRgdkM+PAvQC8sk7Ooflt91juaXA= 

Но пароль, который у меня есть в моей базе данных, которая работала и была сгенерирована той же солью пару дней назад, была:

xZNBNlUa8vRQq0qY5bbkETzZtzztGRTH2KZKijQdilU=

Итак, как вы можете себе представить, я в полном замешательстве. Кто-нибудь знает, если я делаю что-то не так? Или если я оставлю шаг.

Обновление 1: после регистрации нового пользователя в моей системе, похоже, что все другие пользователи в системе изменили свои пароли по какой-то причине. Так что это не имеет ничего общего с тем, как генерируется хэш пароля, и больше связано с моим уровнем доступа к базе данных.

Ответы [ 2 ]

1 голос
/ 29 апреля 2011

Кажется, ваша проблема не связана с перемешиванием и засолкой. Вы отправляете неправильные запросы, которые обновляют нежелательные записи.

Но я добавлю совет о солении - используйте разные соли для каждого пользователя. В противном случае ваши пароли не так надежны. Представьте, что произойдет, если кто-то получит соль и вашу базу данных. Через некоторое время (может быть недели, но это не так много) он сможет создать радужную таблицу и иметь большинство ваших паролей. Хотя, если вы используете другую соль, он должен будет генерировать столько радужных таблиц, сколько и ваших пользователей.

0 голосов
/ 29 апреля 2011

Оказывается, у меня где-то был какой-то хитрый код, который обновлял мой объект пользователя и перезаписывал его пароль новым паролем. Так что алгоритмы хеширования паролей в конце концов работали правильно.

...