Если я принимаю полный Unicode для паролей, как мне нормализовать строку перед передачей ее хеш-функции?
Цели
Без нормализации, если кто-то установит свой пароль «mañana» (ma\u00F1ana
) на одном компьютере и попытается войти в систему с помощью «mañana» (ma\u006E\u0303ana
) на другом компьютере, хэши будут другими, и вход не удастся. Это находится под контролем пользовательского агента или его операционной системы.
- Я хотел бы убедиться, что эти хэши относятся к одному и тому же.
- Меня не беспокоят гомоглифы, такие как Α, А и A (греческий, кириллица, латиница).
Ссылка
Формы нормализации Unicode: http://unicode.org/reports/tr15/#Norm_Forms
Соображения
- Любая процедура нормализации может вызвать коллизии, например.
"office" == "office"
. - Нормализация может изменить количество байтов в строке.
Дальнейшие вопросы
- Что произойдет, если сервер получит последовательность байтов, которая не является допустимой UTF-8 (или другим форматом)? Отклонить, так как его нельзя нормализовать?
- Что произойдет, если сервер получит символы, не назначенные в его версии Unicode?