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