Я в настоящее время работаю над приложением, где мы получаем частную медицинскую информацию. Одна из самых больших проблем с SSN. В настоящее время мы не используем SSN ни для чего, но в будущем мы хотели бы смочь использовать его для однозначного определения пациента через несколько средств. Единственный путь I видит, чтобы сделать, это надежно через SSN. Однако мы (в дополнение к нашим клиентам) ДЕЙСТВИТЕЛЬНО не хотим хранить SSN.
Так естественно я думал просто о SHA, хеширующем его, так как мы просто используем его для идентификации. Проблема с этим состоит в том что, если взломщик знает проблемную область (SSN), то они могут сфокусироваться на том домене. Таким образом, намного легче вычислить миллиард SSNs, а не фактически неограниченного количества паролей. Я знаю, что должен использовать соль сайта и соль на пациента, но являюсь там чем-либо еще, что я могу сделать, чтобы препятствовать тому, чтобы взломщик показал SSN? Вместо SHA я был планированием использования BCrypt, так как Ruby имеет хорошую библиотеку, и это обрабатывает масштабируемую сложность и солящий автоволшебно.
Это не будет используемым в качестве пароля. По существу мы получаем сообщения от многих средств, и каждый описывает пациента. Единственной вещью близко к глобально уникальному идентификатору для пациента является число SSN. Мы собираемся использовать хеш для идентификации того же пациента в нескольких средствах.
Алгоритм генерации номеров социального страхования был создан до появления понятия "хакер", и, как следствие, они чрезвычайно предсказуемы. Использование SSN для аутентификации - очень плохая идея, и не имеет значения, какой криптографический примитив вы используете и насколько велико значение соли. В конце концов, "секрет", который вы пытаетесь защитить, не имеет большой энтропии.
Если вам никогда не понадобится знать открытый текст, тогда вам следует использовать SHA-256. SHA-256 - очень хорошая функция для паролей.
Во-первых, много аплодисментов и похвал за хранение хэша SSN.
Похоже, вы резервируете SSN как своего рода «резервное имя пользователя». В этом случае вам понадобится другая форма аутентификации, помимо имени пользователя - пароль, номер водительского удостоверения, номер паспорта, подтверждение места жительства и т. Д.
Кроме того, если вы обеспокоены тем, что злоумышленник собирается предсказать 10 000 основных номеров SSN для пациента, родившегося в 1984 году в Аризоне, и попытаться выполнить каждый из них, вы можете установить в свое приложение экспоненциально увеличивающийся ограничитель скорости. * Для дополнительной защиты создайте систему уведомлений, которая предупреждает системного администратора, когда появляется необычно большое количество неудачных попыток входа в систему. **
* Пример экспоненциально увеличивающегося ограничителя скорости: После каждого неудачного запроса задерживайте следующий запрос на (1,1 ^ N) секунд, где N - количество неудачных запросов с этого IP-адреса. Отслеживать IP и неудачные попытки входа в систему в таблице БД; не должен добавлять слишком большую нагрузку, в зависимости от аудитории вашего приложения (вы работаете в Google?).
** В случае, если злоумышленник имеет доступ к нескольким IP-адресам, уведомление будет предупреждать системного администратора, который может использовать свое мнение, чтобы увидеть, есть ли у вас наплыв глупых пользователей или это попытка злоумышленника.
Если вы серьезно хотите хэшировать номер социального страхования безопасным способом, сделайте следующее:
Результат: