你会使哪些字符对密码无效?

时间:2009-10-06 08:40:18

标签: security language-agnostic validation passwords

假设情况:您已经实施了密码处理系统,并且不会对可以使用的字符施加任何限制。你想建立一些在两件事之间合理妥协的规则 -

  1. 尽可能让用户自由。
  2. 允许您将来可能更改密码的处理方式 - 您不希望排除合理的实施,因为您的用户现有密码将无效。
  3. 你会施加什么规则?还有其他因素会影响您的选择吗?

12 个答案:

答案 0 :(得分:13)

永远不要施加任何限制。在我看来,你计划存储密码,而不是哈希。不要这样做。而是存储salt并散列密码和所述盐的组合。

但是,您可以通过对长度(例如,不少于6个字符)和构成密码的字符(例如,它应包含小写和大写字母字符)施加限制来要求您的用户拥有相当强的密码,一个或两个数字和几个非字母字符,如^或#)。

答案 1 :(得分:8)

最好没有任何限制,除非你能证明他们的合理性。

如果您是银行,电子邮件提供商,或者如果用户可以在不提供信用卡的情况下订购某些商品,那么强制用户使用强密码是有道理的。否则,你只是无缘无故地努力。

至于你应该存储什么,我会说禁用控制字符的1024个unicode字符是关于所有这些是合理的。如果用户无法输入,则应选择不同的密码。您存储的所有内容都是哈希值,因此您可以随时将其缩小到您想要的任何大小。

答案 2 :(得分:2)

任何非控制角色应该没问题。我认为未来超级密码系统的开发人员会允许“不寻常”的ASCII字符,如标点符号和其他标记,但控制字符有一种习惯,就是难以进入文本模式shell,甚至是期望Tab的GUI对话框和Enter / Return为自己的目的是免费的。

答案 3 :(得分:2)

空白区域(基于在被散列之前可能被意外修剪的逻辑)

答案 4 :(得分:2)

密码没有限制。如果他们可以从键盘输入,无论他们使用什么区域键盘。您可能希望施加最小长度,例如至少一个数字和一个特殊字符,但没有最大限制。

关于你的第二个问题。我实现它的方法是通过制作单独的字段来提高密码强度。例如,现在您将有两个与密码相关的字段:salt,password_md5。让我们稍后说你想使用sha256。创建一个名为password_sha256的新字段。当用户登录时,请先检查password_sha256。如果该字段为空,请检查password_md5。如果匹配,您现在拥有用户输入的纯文本密码。然后,您可以生成sha256密码(我还会重置盐以获得良好的测量值)并存储新值。然后我会在password_md5中删除该值,因此没有人可以反转它来获取密码。

就个人而言,我只会使用您的语言可以做的最佳哈希并使用它。重要的是强制执行一个良好的最小密码策略 - 当密码为“1234”时散列的安全性无关紧要 - 并且使用一些随机字符对散列进行播种以避免字典攻击。

答案 5 :(得分:1)

我个人一直热衷于不执行太多规则。

这刚刚改变了。我刚发现我的网站容易受到XSS攻击。解决方案是清理来自用户的每一条输入,包括密码。

10年来,我们对密码没有限制。 现在我们正在对可以使用的字符实施限制,这只是为了阻止黑客能够访问Javascript或SQL。所以我们构建了以下列表:

密码的有效字符为:a-z A-Z 0-9。 - _ $ *()#@! %/(空白)

这允许很多灵活性但避免可能用于编码XSS hack的字符,例如; < > \ {} [] + =? &安培; ,:''`

HTH

答案 6 :(得分:0)

除了标签外,我会用键盘上的一个键(以及可选择的移位)保留任何内容。什么样的计划需要更严格的选择?

答案 7 :(得分:0)

让用户输入的密码至少包含一个数字和一个非字母数字字符,且长度超过六个字符。无论如何,我认为无论有什么限制,如果你改变验证密码的方式,你应该在合理的时间内通知用户更新他们的密码。

答案 8 :(得分:0)

在我们的组织中,如果用户提供密码,我们允许他们使用他们想要的任何内容。

当用户首次注册系统时,会为他们生成密码。由于此密码通常会邮寄给他们,因此我们避免使用某些可能会混淆的字符,特别是在使用某些字体时。例如,不使用字母O和数字0(零)。 L,I和1(一),S和5,Z和2等都是相同的。

在我们进行此项更改之前,我们向服务台打了很多电话,因为我们混淆了他们无法登录的字符。

答案 9 :(得分:0)

就个人而言,我使用的是DigitalPersona的指纹键盘(是的,微软确实[或者做过]制作类似的设备,无论是与键盘集成还是与键盘分开)。

这样可以生成非常长且复杂的密码,这些密码不必写下来(因为在阅读器上按下手指会将密码提供给登录对话框[系统/应用程序/网站])。

在我看来,这提供了两全其美:极难“猜测”密码,而不必记住密码。它还简化了在不同系统上使用不同密码的额外安全建议。

嗯,这是我的2美分价值。

答案 10 :(得分:-1)

要遵循的一些规则:

  1. 避免使用控制字符。它现在并不普遍,但控制字符都具有特殊含义,一些硬件拦截控制字符以执行特殊功能。有些会导致数据问题示例控件0(零)将生成空值。
  2. 您是否会施加安全限制?这是一个用户界面问题以及安全问题。您的应用程序是什么,它需要安全性。以前给出的许多例子已经过时了。密码组合的哈希表最多可以发布15个字符的密码,如果密码较弱或者遵循典型的人类行为,则可以使用分钟强制使用16个字符的密码。从资本开始,以数字或特殊字符结束。
  3. 我会避免使用OS或DB语言中常用的常用通配符,引号,冒号,分号等等。
  4. 多因素身份验证是一种很好的方法。不要仅依赖密码或根本不接受密码。

答案 11 :(得分:-3)

我建议执行的规则:

  1. 长度 - 不少于8个字符 - 但不超过20个
  2. 易于破解 - 传递不应包含用户的名字,姓氏或用户名,也不应包含(如果可能的话)检查英语词典中出现的任何单词。
  3. 内容 - 键盘上有4种类型的字符:大写,小写,数字和标点符号。一个好的密码应该包括来自至少3组的代表,并且连续不超过同一组的2-3个字符。