Лучшая практика для двухстороннего хеширования в python? - PullRequest
2 голосов
/ 29 марта 2009

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

http://www.example.com/verifyemail?id=some-random-string

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

Единственное требование - эта 'some-random-string' должна быть настолько непрозрачной и не угадываемой для пользователя, насколько это возможно.


Наконец, это то, на чем я остановился

def p3_encrypt_safe(plain, key):
    return base64.urlsafe_b64encode(p3_encrypt(plain, key))

использовал красивую криптобиблиотеку из http://www.nightsong.com/phr/crypto/p3.py добавление безопасного кодирования base64 - мое.

Ответы [ 2 ]

5 голосов
/ 29 марта 2009

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

>>> import hashlib
>>> hashlib.sha1('3').hexdigest()
'77de68daecd823babbb58edb1c8e14d7106e83bb'

Однако основание вашей псевдослучайной строки только на идентификаторе строки не очень безопасно, так как пользователь может легко изменить хеш (попробуйте googling 77de68daecd823babbb58edb1c8e14d7106e83bb ) такой короткой строки.

Простое решение здесь состоит в том, чтобы «засолить» хешированную строку, т.е. добавить одну и ту же секретную строку к каждому хэшированному значению. Например:

>>> hashlib.sha1('3' + 'email@of.user' + 'somestringconstant').hexdigest()
'b3ca694a9987f39783a324f00cfe8279601decd3'

Если вы google b3ca694a9987f39783a324f00cfe8279601decd3 , вероятно, единственным результатом будет ссылка на этот ответ :-), которая не является доказательством, но дает хороший намек на то, что этот хэш является совершенно уникальным.

4 голосов
/ 29 марта 2009

Используйте шифрование, это именно то, для чего он предназначен. Blowfish, AES, даже DES3, если вам не требуется особо высокий уровень безопасности.

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

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