【问题标题】:ascii characters to avoid in passwords密码中要避免的 ascii 字符
【发布时间】:2014-04-21 21:22:48
【问题描述】:

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

网站通常会限制可用于密码的字符。例如,不能使用空格或尖括号。

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

【问题讨论】:

  • 我相信大多数人鼓励使用特殊字符并禁止使用常用词和短语来应对字典攻击
  • 这让我对几个网站感到疯狂。银行是最糟糕的。我的银行密码过去是强制 6-8 个字符,全部小写。我打电话给他们的公司办公室并抱怨并亲自改变了那个。很多很多密码策略与正确理解安全性毫无关系。
  • ASP.NET 将阻止包含< 字符的输入序列,因为Request Validation 阻止它们以错误的方式阻止XSS

标签: security passwords web-deployment


【解决方案1】:

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

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

【讨论】:

  • 避免相似符号仅对自动生成的密码有意义。如果您的用户提供自己的密码,那么避免使用相似的符号是没有意义的。
  • 假设我们谈论的是自动生成的代码,是否有一个可以使用的拉丁字符 + 数值的白名单?
【解决方案2】:

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

>>> 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

【讨论】:

  • 感谢您指出。当我开始国际化我的代码时,我会牢记这一点。
  • 您的用户不仅可以使用您的界面语言输入密码。
  • 是的。但是django不应该照顾它吗?我看一下代码,看看 django 是否考虑到了这一点。
  • 由于您询问密码限制,我假设您正在设置自己的解决方案,而不是使用捆绑的django.contrib.auth。我不知道他们是否也解决了这个问题。
猜你喜欢
  • 2010-09-08
  • 2013-06-04
  • 2023-03-07
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
相关资源
最近更新 更多