Это была моя проблема пару недель назад.
Мы развертывали большой проект MIS в 975 различных географических точках, где наше собственное хранилище учетных данных будет использоваться в качестве средства проверки подлинности для различного набора уже реализованных и используемых приложений. Мы уже предоставили сервис аутентификации на основе REST и SOAP, но заказчик настаивал на том, чтобы иметь возможность получить доступ к хранилищу учетных данных пользователя из других приложений, просто подключившись к БД для просмотра только связанной таблицы или представления. Вздох ... (это очень связанное плохое проектное решение - предмет другого вопроса).
Это заставило нас сесть и преобразовать нашу соленую и итеративно хешированную схему хранения паролей в спецификацию и предоставить несколько разных языковых реализаций для легкой интеграции.
Мы назвали его «Защищенные хешированные пароли» или FSHP , короче говоря.
Реализовал его в Python, Ruby, PHP5 и выпустил в Public Domain. Доступно для потребления, разветвления, воспламенения или плевки на GitHub на http://github.com/bdd/fshp
FSHP - это реализация хеширования пароля с итеративным хэшированием.
Принцип конструкции аналогичен спецификации PBKDF1 в RFC 2898
(a.k.a: PKCS # 5: спецификация шифрования на основе пароля, версия 2.0.)
FSHP позволяет выбрать длину соли, количество итераций и
лежащая в основе криптографическая хеш-функция среди SHA-1 и SHA-2 (256, 384, 512).
Самоопределение мета-префикса в начале каждого вывода делает его переносимым, позволяя потребителю выбирать собственный базовый уровень безопасности хранения пароля.
БЕЗОПАСНОСТЬ
По умолчанию FSHP1 использует 8-байтовые соли с 4096 итерациями хеширования SHA-256.
- 8-байтовая соль делает атаки на радужные таблицы нецелесообразными, умножая
необходимое место с 2 ^ 64.
- 4096 итераций приводят к довольно дорогостоящим атакам методом перебора.
- Нет известных атак против SHA-256, чтобы найти столкновения с
вычислительное усилие менее чем 2 ^ 128 операций во время
этот выпуск.
реализации:
- Python: протестировано с 2.3.5 (с hashlib), 2.5.1, 2.6.1
- Ruby: протестировано с 1.8.6
- PHP5: протестировано с 5.2.6
Каждый может создать недостающие языковые реализации или
отполировать текущие.
ОСНОВНЫЕ ОПЕРАЦИИ (с Python) :
>>> fsh = fshp.crypt('OrpheanBeholderScryDoubt')
>>> print fsh
{FSHP1|8|4096}GVSUFDAjdh0vBosn1GUhzGLHP7BmkbCZVH/3TQqGIjADXpc+6NCg3g==
>>> fshp.validate('OrpheanBeholderScryDoubt', fsh)
True
НАСТРОЙКА КРИПТА:
Давайте ослабим нашу схему хеширования паролей.
- Уменьшить длину соли с 8 до 2.
- Уменьшить цикл итерации с 4096 до 10.
- Выберите FSHP0 с SHA-1 в качестве основного алгоритма хеширования.
>>> fsh = fshp.crypt('ExecuteOrder66', saltlen=2, rounds=10, variant=0)
>>> print fsh
{FSHP0|2|10}Nge7yRT/vueEGVFPIxcDjiaHQGFQaQ==