Как правильно реализовать пароли Unicode?

Добавление поддержки паролей Unicode - важная функция, которую разработчики не должны игнорировать.

Тем не менее, добавление поддержки Unicode в паролях является сложной задачей, потому что один и тот же текст может быть закодирован по-разному в Unicode, и вы не хотите препятствовать входу людей из-за этого.

Допустим, вы будете хранить пароли как UTF-8, и помните, что этот вопрос не связан с кодировками Unicode, а связан с нормализацией Unicode.

Теперь вопрос, как вам следует нормализовать данные Unicode?

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

Примечание: все же есть места, где пароли Unicode, вероятно, никогда не будут использоваться, но этот вопрос не о том, почему и когда использовать пароли Unicode, а о том, как правильно их реализовать.

1-е обновление

Можно ли реализовать это без использования ICU, как с помощью ОС для нормализации?

2 ответа

Решение

Хорошее начало - прочитать Юникод TR 15: Формы нормализации Юникода. Затем вы понимаете, что это много работы и подвержены странным ошибкам - вы, вероятно, уже знаете эту часть, так как вы спрашиваете здесь. Наконец, вы загружаете что-то вроде ICU и позволяете ему сделать это за вас.

IIRC, это многоступенчатый процесс. Сначала вы раскладываете последовательность до тех пор, пока не сможете продолжить декомпозицию - например, é станет e + ´. Затем вы переупорядочиваете последовательности в четко определенный порядок. Наконец, вы можете кодировать результирующий поток байтов, используя UTF-8 или что-то подобное. Поток байтов UTF-8 может быть передан в алгоритм шифрования по вашему выбору и сохранен в постоянном хранилище. Если вы хотите проверить, совпадает ли пароль, выполните ту же процедуру и сравните выходные данные алгоритма хеширования с тем, что хранится в базе данных.

Вопрос к вам - можете ли вы объяснить, почему вы добавили "без использования ICU"? Я вижу много вопросов о том, что ICU делает (мы * думаем) довольно хорошо, но "без использования ICU". Просто любопытно.

Во-вторых, вас может заинтересовать StringPrep/NamePrep, а не просто нормализация: StringPrep - для сопоставления строк для сравнения.

В-третьих, вы можете быть заинтересованы в UTR#36 и UTR#39 для других последствий безопасности Unicode.

*(раскрытие: разработчик ICU:)

Другие вопросы по тегам