如果我接受完整的 Unicode 密码,我应该如何在将字符串传递给哈希函数之前对其进行规范化?
目标
如果没有规范化,如果有人ma\u00F1ana
在一台计算机ma\u006E\u0303ana
上将他们的密码设置为“mañana”(这是在用户代理或其操作系统的控制之下。
- 我想确保这些哈希值相同。
- 我不关心诸如Α、А 和 A(希腊语、西里尔语、拉丁语)之类的同形文字。
参考
Unicode 规范化形式:http ://unicode.org/reports/tr15/#Norm_Forms
注意事项
- 任何标准化过程都可能导致冲突,例如
"office" == "office"
。 - 规范化可以改变字符串中的字节数。
进一步的问题
- 如果服务器接收到无效的 UTF-8(或其他格式)的字节序列会发生什么?拒绝,因为它不能被规范化?
- 如果服务器接收到在其 Unicode 版本中未分配的字符会怎样?