添加对Unicode密码的支持,这是开发人员不应忽视的重要功能。
但是,在密码中添加对Unicode的支持是一项棘手的工作,因为相同的文本可以在Unicode中以不同的方式编码,并且您不希望阻止人们因此而登录。
假设您将密码存储为UTF-8,并且请注意此问题与Unicode编码无关,并且与 Unicode规范化相关。
现在的问题是你应该如何规范化 Unicode数据?
你必须确保你能够比较它。您需要确保在下一个Unicode标准发布时,它不会使您的密码验证无效。
注意:仍有一些地方可能永远不会使用Unicode密码,但这个问题不是why or when to use Unicode passwords,而是关于如何以正确的方式实现它们。
是否可以在不使用ICU的情况下实现此功能,例如使用OS进行规范化?
答案 0 :(得分:6)
一个好的开始是阅读Unicode TR 15: Unicode Normalization Forms。然后你意识到它是很多工作并且容易出现奇怪的错误 - 你可能已经知道这部分,因为你在这里问。最后,下载ICU和let it do it for you等内容。
IIRC,这是一个多步骤的过程。首先你分解序列直到你不能进一步分解 - 例如é会变成e +'。然后,您将序列重新排序为明确定义的顺序。最后,您可以使用UTF-8或类似的方法对生成的字节流进行编码。 UTF-8字节流可以输入您选择的加密哈希算法并存储在持久存储中。如果要检查密码是否匹配,请执行相同的过程,并将散列算法的输出与存储在数据库中的内容进行比较。答案 1 :(得分:0)
回答您的问题 - 您能解释为什么添加“不使用ICU”吗?我看到很多问题要求ICU做的事情(我们认为)很好,但“不使用ICU”。只是好奇。
其次,您可能对StringPrep / NamePrep感兴趣而不仅仅是规范化:StringPrep - 映射字符串以进行比较。
第三,您可能对UTR#36和UTR#39对其他Unicode安全隐患感兴趣。
* (披露:ICU开发人员:)