Skip to main content

V2.4.2 Credential Storage

Requirement:#

Verify that the salt is at least 32 bits in length and be chosen arbitrarily to minimize salt value collisions among stored hashes. For each credential, a unique salt value and the resulting hash SHALL be stored. (C6)

Explanation:#

Существуют схемы формирования динамической соли, при которых значения соли генерируются для каждого входного значения индивидуально, что затрудняет составление словарей перебора, а также скрывает факт хранения одинаковых паролей, используемых разными пользователями. Также эффективность схемы увеличивается, если используется нетривиальное подмешивание по некоторому алгоритму. Например, соль можно не просто приписывать к концу пароля, а «подмешивать» в определённые промежутки пароля. К тому же хэш можно вычислять циклически, подмешивая соль частями с некоторыми изменениями, зависящими от номера итерации хэширования.

Remediation:#

Вот шаги для реализации безопасного механизма хэширования и хранения паролей, который соответствует указанным вами требованиям:

  • Генерируйте уникальное значение соли для каждого пароля: значение соли должно генерироваться случайным образом и иметь длину не менее 32 бит. Это значение должно быть уникальным для каждого хэша пароля и храниться в безопасном месте вместе с результирующим хэшем.
  • Хэшируйте пароль: используя безопасную хэш-функцию, такую ​​как bcrypt, scrypt или Argon2, хэшируйте пароль с помощью сгенерированного значения соли. Это создаст уникальный хэш для каждого пароля, даже если у двух пользователей одинаковый пароль.
  • Сохраните соль и хэш: Сохраните значение соли и полученный хэш в защищенной базе данных или файле. Убедитесь, что место хранения безопасно и защищено от несанкционированного доступа.
  • Проверка паролей: когда пользователь входит в систему, система должна получить значение соли и хэш для учетной записи пользователя. Затем он должен хэшировать введенный пароль с извлеченным значением соли и сравнить результат с сохраненным хешем. Если два значения совпадают, пользователь аутентифицируется.
  • Регулярно обновляйте хэши: в качестве меры безопасности рекомендуется периодически повторно хэшировать все сохраненные пароли с использованием новейших стандартов и алгоритмов безопасности. Это помогает защитить хэши паролей от недавно обнаруженных атак. 

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

Пример хеширования на Python

Пример хеширования на Python
import hashlib
import os
salt = os.urandom(32) # Запомните
password = 'password123'
key = hashlib.pbkdf2_hmac(
'sha256', # Используемый алгоритм хеширования
password.encode('utf-8'), # Конвертируется пароль в байты
salt, # Предоставляется соль
100000 # Рекомендуется использовать хотя бы 100000 итераций SHA-256

Additional:#

https://www.php.net/manual/ru/function.password-hash.php

https://devsday.ru/blog/details/15159