8

添加对 Unicode 密码的支持是开发人员不应忽视的一项重要功能。

尽管如此,在密码中添加对 Unicode 的支持是一项棘手的工作,因为相同的文本可以在 Unicode 中以不同的方式编码,并且您不希望因此而阻止人们登录。

假设您将密码存储为 UTF-8,请注意这个问题与 Unicode encodings 无关,它与Unicode normalization有关。

现在的问题是如何规范化Unicode 数据?

你必须确保你能够比较它。您需要确保下一个 Unicode 标准发布时不会使您的密码验证无效。

注意:仍然有一些地方可能永远不会使用 Unicode 密码,但这个问题不是关于为什么或何时使用 Unicode 密码,而是关于如何以正确的方式实现它们。

第一次更新

是否可以在不使用 ICU 的情况下实现这一点,例如使用操作系统进行规范化?

4

2 回答 2

6

一个好的开始是阅读Unicode TR 15: Unicode Normalization Forms。然后你意识到这是很多工作并且容易出现奇怪的错误——你可能已经知道这部分了,因为你在这里问。最后,你下载ICU之类的东西,让它为你做

IIRC,这是一个多步骤的过程。首先你分解序列,直到你不能进一步分解——例如 é 会变成 e + ´。然后将序列重新排序为明确定义的顺序。最后,您可以使用 UTF-8 或类似的方式对生成的字节流进行编码。UTF-8 字节流可以输入您选择的加密哈希算法并存储在持久存储中。当您要检查密码是否匹配时,请执行相同的过程并将哈希算法的输出与存储在数据库中的内容进行比较。

于 2010-05-09T19:34:14.090 回答
0

给你一个问题——你能解释一下为什么你添加了“不使用 ICU”吗?我看到很多问题都在询问 ICU 做得很好(我们*认为)但“不使用 ICU”的事情。只是好奇。

其次,您可能对 StringPrep/NamePrep 感兴趣,而不仅仅是规范化:StringPrep - 映射字符串以进行比较。

第三,您可能对UTR#36UTR#39感兴趣,以了解其他 Unicode 安全问题。

* (披露:ICU 开发人员 :)

于 2010-05-10T17:40:35.160 回答