Хеширование SSN и другой информации с ограниченным доменом

В настоящее время я работаю над приложением, в котором мы получаем конфиденциальную информацию о здоровье. Одна из самых больших проблем связана с SSN. В настоящее время мы не используем SSN для чего-либо, но в будущем мы хотели бы использовать его для уникальной идентификации пациента на нескольких объектах. Единственный способ, которым я могу это сделать, - это SSN. Однако мы (в дополнение к нашим клиентам) ДЕЙСТВИТЕЛЬНО не хотим хранить SSN.

Поэтому, естественно, я думал о том, что SHA хеширует его, поскольку мы просто используем его для идентификации. Проблема заключается в том, что если злоумышленник знает проблемный домен (SSN), то они могут сосредоточиться на этом домене. Поэтому гораздо проще вычислить миллиарды SSN, а не фактически неограниченное количество паролей. Я знаю, что я должен использовать соль сайта и соль для пациентов, но есть ли что-нибудь еще, что я могу сделать, чтобы предотвратить появление злоумышленником SSN? Вместо SHA я планировал использовать BCrypt, так как Ruby имеет хорошую библиотеку, и он автоматически обрабатывает масштабируемую сложность и засовывает.

Он не будет использоваться в качестве пароля. По сути, мы получаем сообщения от многих объектов, и каждый описывает пациента. Единственное, что близко к глобально уникальному идентификатору для пациента, - это номер SSN. Мы собираемся использовать хеш для идентификации одного и того же пациента на нескольких объектах.

Ответ 1

Алгоритм генерации номеров социального обеспечения был создан до концепции хакера и, как следствие, чрезвычайно предсказуем. Использование SSN для аутентификации - очень плохая идея, на самом деле не имеет значения, какой криптографический примитив вы используете или насколько велика ваша ценность соли. В конце дня "секрет", который вы пытаетесь защитить, не имеет большой энтропии.

Если вам никогда не нужно знать простой текст, вы должны использовать SHA-256. SHA-256 - очень хорошая функция для использования паролей.

Ответ 2

Если вы серьезно хотите присвоить номер социального страхования безопасным способом, сделайте следующее:

  • Узнайте, сколько энтропии находится в SSN (намек: очень мало. Гораздо меньше, чем случайно выбранный 9 значный номер).
  • Используйте любой алгоритм хэширования.
  • Хранить меньше (половину?) бит, чем в SSN есть энтропия.

Результат:

  • Pro: безопасный хэш SSN из-за большое количество хэш-коллизий.
  • Pro: ваши хэши короткие и удобные для хранения.
  • Con: столкновение хэшей.
  • Con: вы не можете использовать его для уникального идентификатор из-за Con # 1.
  • Pro: Это хорошо, потому что ты действительно действительно не нужно использовать SSN как если вы не являетесь социальным Администрирование безопасности.

Ответ 3

Во-первых, много аплодисментов и похвалы за хранение хэша SSN.

Кажется, что вы резервируете SSN как своего рода "резервное имя пользователя". В этом случае вам нужна другая форма аутентификации, кроме имени пользователя - пароль, номер лицензии водителя, номер паспорта, доказательство проживания и т.д.

Кроме того, если вы обеспокоены тем, что злоумышленник будет прогнозировать 10 000 SSN для пациента, родившегося в 1984 году в Аризоне, и попытаться выполнить каждый из них, то вы можете добавить в свою программу экспоненциально возрастающий ограничитель скорости. * Для дополнительной защиты создайте систему уведомлений, которая предупреждает sys-admin, когда появляется необычное количество неудачных попыток входа в систему. **

* Пример экспоненциально возрастающего ограничителя скорости: После каждого неудачного запроса задерживайте следующий запрос (1.1 ^ N) секунд, где N - количество неудавшихся запросов от этого IP-адреса. Отслеживание IP-адресов и неудачных попыток входа в таблицу DB; не следует добавлять слишком большую нагрузку, в зависимости от аудитории вашего приложения (вы работаете в Google?).

** В случае, когда злоумышленник имеет доступ к нескольким IP-адресам, уведомление будет предупреждать sys-admin, который может использовать свое решение, чтобы узнать, есть ли у вас приток глупых пользователей или это вредоносная попытка.