密码中要避免的ascii字符



我最近开始使用django进行web开发。当在用户注册页面上工作时,我在研究关于密码的一些事情。

网站通常对密码中可以使用的字符进行限制。例如,不能使用空格或尖括号。

因为所有输入在存储到数据库之前都经过了清理和哈希处理,所以在密码中使用任何可打印的ascii字符应该都不是问题。。。正确的或者我错过了什么。

您没有遗漏任何内容。大多数情况下,排除空格或任何可打印ASCII字符的唯一原因是编码不正确。

其他时候,它是为了消除自动生成密码(I-l-1、O-0等)中类似字符的歧义。

您唯一关心的密码内容应该是Unicode规范化。不同操作系统生成的Unicode符号存在细微差异——例如,一些操作系统可能将"à"等字母编码为单个字符(U+00E0),而另一些操作系统则可能生成"aÉ"(两个字符:普通拉丁字母a,后面是组合重音符字符U+0300)。在对Unicode密码进行哈希之前,您应该将其标准化,以确保当用户在不同的操作系统上键入密码时,这些差异不会阻止他们访问自己的帐户。

>>> a1 = u'à'
>>> a2 = u'à'
>>> a1
u'xe0'
>>> a2
u'au0300'
>>> a1 == a2
False
>>> from unicodedata import normalize
>>> normalize('NFC', a1) == normalize('NFC', a2)
True

最新更新