Security 密码中要避免的ascii字符

Security 密码中要避免的ascii字符,security,passwords,web-deployment,Security,Passwords,Web Deployment,我最近开始使用django进行web开发。在用户注册页面上工作时, 我在研究一些关于密码的东西 网站通常对密码中可以使用的字符进行限制。例如,不能使用空格或尖括号 因为所有的输入在存储到数据库之前都会被清理和散列,所以在密码中使用任何可打印的ascii字符应该不是问题。。。正确的?或者我遗漏了什么。你没有遗漏任何东西。大多数情况下,排除空格或任何可打印ASCII字符的唯一原因是编码错误 其他时候,它是为了消除自动生成的密码(I-l-1、O-0等)中相似字符的歧义。您唯一关心的密码内容应该是Uni

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

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


因为所有的输入在存储到数据库之前都会被清理和散列,所以在密码中使用任何可打印的ascii字符应该不是问题。。。正确的?或者我遗漏了什么。

你没有遗漏任何东西。大多数情况下,排除空格或任何可打印ASCII字符的唯一原因是编码错误


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

您唯一关心的密码内容应该是Unicode规范化。不同操作系统生成的Unicode符号之间存在细微差异——例如,有些可能将“a”这样的字母编码为单个字符(
U+00E0
),而另一些可能生成“a”(两个字符:纯拉丁字母
a
,后跟
U+0300
)。在散列密码之前,您应该使用Unicode密码,以确保当您的用户在不同的操作系统上键入密码时,这些差异不会阻止他们访问其帐户

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

我相信大多数人都鼓励使用特殊字符,禁止使用常用单词和短语来对付字典攻击。这让我对几个网站着迷。银行是最糟糕的。我的银行密码过去是6-8个小写字符。我给他们的公司办公室打电话抱怨,并亲自换了一个。很多很多密码策略与正确理解安全性无关。ASP.NET将阻止包含
的输入序列,避免使用相像符号,这仅对自动生成的密码有意义。如果您的用户提供自己的密码,避免使用相似的符号是毫无意义的。假设我们讨论的是自动生成的代码,是否有一个可以使用的拉丁字符+数值的白名单?谢谢您指出。当我开始国际化我的代码时,我会记住这一点。你的用户不仅限于输入界面语言的密码。真的。但是django不应该照顾它吗?我将查看代码,看看django是否考虑到了这一点。由于您询问的是密码限制,我假设您正在设置自己的解决方案,而不是使用捆绑的
django.contrib.auth
。我也不知道他们是否已经解决了这个问题。