Добавление поддержки паролей Unicode это важная функция, которая не должна быть проигнорирована разработчиками.
Однако, добавление поддержки Unicode в паролях является хитрым заданием, потому что тот же текст может быть закодирован по-разному в Unicode, и Вы не хотите препятствовать тому, чтобы люди вошли в систему из-за этого.
Скажем, то, что Вы сохраните пароли как UTF-8 и ум, что этот вопрос не связан с кодировкой Unicode и он связан с нормализацией Unicode.
Теперь вопрос состоит в том, как необходимо нормализовать данные Unicode?
Необходимо быть уверены, что Вы сможете сравнить его. Необходимо быть уверены, что, когда следующий стандарт Unicode будет выпущен, он не будет делать недействительным проверку пароля.
Примечание: все еще существуют некоторые места, где пароли Unicode никогда не будут, вероятно, использоваться, но этот вопрос не о том, почему или когда использовать пароли Unicode, это о том, как реализовать их надлежащим способом.
Действительно ли возможно реализовать это, не используя ICU, как использование ОС для нормализации?
Хорошее начало - прочитать Unicode TR 15: Unicode Normalization Forms. Затем вы понимаете, что это большая работа и чревато странными ошибками - вы, вероятно, уже знаете эту часть, раз спрашиваете здесь. Наконец, вы скачиваете что-то вроде ICU и позволяете ему сделать это за вас.
IIRC, это многоступенчатый процесс. Сначала вы разлагаете последовательность до невозможности дальнейшего разложения - например, é превращается в e + ´. Затем вы переупорядочиваете последовательности в четко определенном порядке. Наконец, вы можете закодировать полученный поток байтов, используя UTF-8 или что-то подобное. Поток байтов UTF-8 можно передать в криптографический хэш-алгоритм по вашему выбору и сохранить в постоянном хранилище. Когда вы захотите проверить, совпадает ли пароль, выполните ту же процедуру и сравните результат работы хэш-алгоритма с тем, что хранится в базе данных.
Ответный вопрос - можете ли вы объяснить, почему вы добавили «без использования ICU»? Я вижу много вопросов, касающихся вещей, которые ICU делает (мы * думаем) довольно хорошо, но «без использования ICU». Просто любопытно.
Во-вторых, вас может заинтересовать StringPrep / NamePrep, а не просто нормализация: StringPrep - отображение строк для сравнения.
В-третьих, вас могут заинтересовать UTR # 36 и UTR # 39 для других последствий безопасности Unicode.
* (раскрытие: разработчик ICU :)