Как спроектировать систему, позволяющую переносить шифрование? - PullRequest
4 голосов
/ 01 января 2012

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

Скажем, через 2 месяца я обнаружил шифрование, которое в 10 раз лучше, и текущая хеш-функция, без сомнения, оказалась абсолютно уязвимой.Как мне перейти к переносу пароля пользователя из одного типа хэша в другой (лучший).

Ответы [ 4 ]

5 голосов
/ 01 января 2012

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

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

id    name    password    salt    hashmethod
--------------------------------------------
1     alice   ABC52...    ABD...  md5
2     bob     28DHF...    Z+d...  sha1
...

Скажите, что ваш устаревший метод хэширования - md5, и вы хотите заменить его на более безопасный sha1, вот что вы делаете:

  • Пользователь входит в систему, вы хэшируете его пароль с помощью new метода (sha1) и соли.
    • a) Если найдено совпадение (соответствующее имя пользователя, пароль и метод sha1), пользователь регистрируется.
    • b) Если найдено совпадение , а не найдено:
      • 1) Вы хешируете с помощью старого метода (md5) и соли.
        • a) Если найдено совпадение (соответствующее имя пользователя, пароль и метод md5), вы хэшируете пароль с помощью метода new (sha1) и salt и соответственно обновляете базу данных. Пользователь вошел в систему.
        • b) Если совпадение не не найдено, учетные данные недействительны и пользователь не зарегистрирован.

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

Надеюсь, это поможет.

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

Как правило, вы делаете это следующим образом:

1) Вы генерируете пару открытого / закрытого ключей, обычно используя RSA.

2) Вы тщательно защищаете закрытый ключ.Вы никогда, никогда не храните это онлайн.(Возможно, вы захотите разделить его пополам и доверить это разным людям. Возможно, вы захотите использовать безопасный секретный обмен. Возможно, вы захотите защитить его токеном.)

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

4) Если в будущем потребуется восстановление незашифрованных паролей, вы восстановите закрытый ключ и расшифруете сохраненные копии паролей.

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

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

В общем, вы не можете.Вы не можете восстановить пароли из хэшей;в этом весь смысл хэша.Если исходная хеш-функция была настолько повреждена, что вы можете восстановить пароли, то вы можете просто сделать это и затем хешировать их с помощью новой функции.

0 голосов
/ 01 января 2012

Это относится только к системам, которые используют односторонний метод хеширования для хранения паролей и сравнивают хэши при аутентификации.

Если от вашей системы требуется такое частое обновление, я бы сделал следующее.

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

В моей таблице базы данных, хранящей информацию о пользователе и пароль, я бы включил целочисленное поле уровня хеширования. Это указывает, какой метод хеширования использует пользователь.

Когда система добавляется с новым методом хэширования, будет увеличен самый высокий уровень хэширования.

Допустим, у меня уже есть 2 метода хеширования

1    MD5
2    SHA1
3    SHA256

Если я добавлю новый метод хеширования SHA512, он станет

4    SHA512

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

  • Если хеши паролей совпадают, но уровень хеширования пользователя не самый высокий уровень хеширования, предлагаемый системой, тогда хешируйте входной пароль пользователя, т.е. обычный текст, используя самый высокий уровень хеширования, и устанавливайте уровень хеширования. пользователя до самого высокого уровня хеширования. Пользователь аутентифицируется.
  • Если хеши паролей совпадают, а уровень хеширования пользователя является самым высоким уровнем хеширования, то пользователь проходит аутентификацию.
  • Если хеши паролей вообще не совпадают, то пользователю отказано.

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

...