Соленый хешированный пароль с Python (разная соль для каждого нового пароля)

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

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

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

Кто-нибудь может посоветовать по этому поводу?

ПРИМЕЧАНИЕ. Я использую либо встроенную библиотеку Python (hashlib), либо Bycrypt (Cryptacular или Библиотека доступа)


person MrCooL    schedule 16.06.2012    source источник


Ответы (3)


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

Это именно то, что вы делаете. Знание соли на самом деле не умаляет их преимуществ:

  • Одинаковые пароли в вашей базе данных будут иметь разные хэши.
  • Радужные столы не будут работать.
  • Атаки грубой силы, которые пытаются сопоставить любой из ваших хэшей, будут замедлены.
person Oliver Charlesworth    schedule 16.06.2012
comment
аааа.... Это круто... ха-ха... Я видел ваш первый пост, без этих последних 3 пунктов, и я печатал больше сомнительных вопросов, пока вы не ответили на мои сомнения этими последними 3 пунктами. Большое спасибо за быстрый ответ! - person MrCooL; 16.06.2012

Если вы используете cryptacular.bcrypt.BCRYPTPasswordManager, вам не нужно беспокоиться о солях. Он заботится о создании и хранении соли с хэшем.

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

Например:

>>> import cryptacular.bcrypt
>>> crypt = cryptacular.bcrypt.BCRYPTPasswordManager()
>>> crypt.encode('aaa')
'$2a$10$B0czYdLVHJG4x0HnEuVX2eF7T9m1UZKynw.gRCrq8S98z84msdxdi'
>>> crypt.encode('aaa')
'$2a$10$Ni7K.pQoal3irbGmREYojOYoi0lye/W0Okz7jqoynRJhW5OCi8Upu'
person shastry    schedule 03.03.2013

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

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

Если вместо хранения хэша(пароля) вы сохраните хеш(пароль+соль) (или хэш(соль+пароль)) вы можете сделать эту атаку по словарю недействительной, потому что если ваша соль 'dza$^"é)àù' вероятность что словарь содержит 'dza$^"é)àùgod', как правило, равен 0.

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

person AsTeR    schedule 16.06.2012
comment
Привет @Aster, ценю, что поделился. Эээ... Насколько я знаю, каждому новому паролю нужна разная соль по одной из веских причин: 1. Идентичный пароль с одинаковой солью имеет одинаковое хэш-значение, и, таким образом, хакер/злоумышленник может легко взломать более одного пароля. однажды им удалось сломать один из них. В любом случае, я думаю, что ваш ответ поможет другим людям, которые хотели бы узнать больше о пользе использования соли, чтобы рассказать об этом большему количеству людей. Спасибо за раздачу. :) - person MrCooL; 16.06.2012
comment
Я согласен (как упоминалось в моем посте, я сделал опечатку, из-за которой может быть непонятно), но я сомневаюсь, что это конкретно сделано во многих приложениях (насколько я знаю, большинство CMS, таких как Wordpress и Joomla, не реализует Это). - person AsTeR; 17.06.2012