哈希时,什么Unicode规范化(和其他处理)适用于密码?
如果我接受完整的Unicode密码,我应该如何在将字符串传递给哈希函数之前规范化它 目标 如果没有规范化,如果有人在一台计算机上将密码设置为“mañana”(哈希时,什么Unicode规范化(和其他处理)适用于密码?,unicode,passwords,unicode-normalization,password-storage,homoglyph,Unicode,Passwords,Unicode Normalization,Password Storage,Homoglyph,如果我接受完整的Unicode密码,我应该如何在将字符串传递给哈希函数之前规范化它 目标 如果没有规范化,如果有人在一台计算机上将密码设置为“mañana”(ma\u00F1ana),并试图在另一台计算机上使用“mañana”(ma\u006E\u0303ana)登录,哈希值将不同,登录将失败。这由用户代理或其操作系统控制 我想确保这些哈希值是相同的 我不关心同形文字,例如(希腊语、西里尔语、拉丁语) 参考文献 Unicode规范化表单: 考虑 任何规范化过程都可能导致冲突,例如,“办公
ma\u00F1ana
),并试图在另一台计算机上使用“mañana”(ma\u006E\u0303ana
)登录,哈希值将不同,登录将失败。这由用户代理或其操作系统控制
- 我想确保这些哈希值是相同的
- 我不关心同形文字,例如(希腊语、西里尔语、拉丁语)
- 任何规范化过程都可能导致冲突,例如,
“办公室”==“办公室”
- 规范化可以更改字符串中的字节数
- 如果服务器接收到无效的UTF-8(或其他格式)字节序列,会发生什么情况?拒绝,因为它不能正常化
- 如果服务器接收到Unicode版本中未分配的字符,会发生什么情况
建议#3:在散列之前应用NFKC或NFKD。您主要关心的是用户在不同设备上使用不同的输入方法吗?您的示例包括连接器,但是零宽度连接器和组合器呢?类似但语义不同的代码点,如I(拉丁字母)vsⅠ(罗马数字)vsI (CJK全宽)?我不关心同形符——他们不太可能使用只共享一些(接近)同形符的输入法键入整个密码——但我必须考虑加入者。也许准备Unicode进行密码散列需要一种更彻底的方法。回答得好。如果能参考RFC4013()及其替代品saslprepbis(),那就更好了。哦,很好的参考资料!是否要编辑答案以包含这些内容?恐怕我所有的Unicode规范化知识现在都没有了-(这些引用已被取代。RFC 7613()淘汰了RFC 4013,而PRECIS框架()是saslprepbis过程的最终结果。NFKD是一种方法,如果使用NFKC并将新的预合成字符添加到unicode中,则结果将不同。