Passwords 密码中允许哪些字符的最佳规则是什么?

Passwords 密码中允许哪些字符的最佳规则是什么?,passwords,special-characters,password-policy,Passwords,Special Characters,Password Policy,我想说的是我应该允许每一个角色。它在任何情况下都会被散列,我不想限制那些想要创建强密码的人 然而,仔细想想,有很多角色我不知道他们会对事情产生什么影响。外来字符、ascii符号等来命名一对 我试着用谷歌搜索,但我找不到任何明确的标准来衡量人们的行为。即使是最专业的组织似乎也不知道。这似乎是一个常见的做法,许多网站不允许特殊字符完全,这只是愚蠢的,而不是我想做的 不管怎样,对于长度、允许的字符等有什么标准建议吗 我不确定这是否重要,但我将使用ASP.NET w/C#而不是专家,但我讨厌我选择的角色

我想说的是我应该允许每一个角色。它在任何情况下都会被散列,我不想限制那些想要创建强密码的人

然而,仔细想想,有很多角色我不知道他们会对事情产生什么影响。外来字符、ascii符号等来命名一对

我试着用谷歌搜索,但我找不到任何明确的标准来衡量人们的行为。即使是最专业的组织似乎也不知道。这似乎是一个常见的做法,许多网站不允许特殊字符完全,这只是愚蠢的,而不是我想做的

不管怎样,对于长度、允许的字符等有什么标准建议吗


我不确定这是否重要,但我将使用ASP.NET w/C#

而不是专家,但我讨厌我选择的角色被拒绝,也不太奇怪。所以,我想我同意你的直觉。

在有限的设备(手机、控制台等)上输入密码时,非ASCII字符肯定会让事情变得更困难,但通常并非不可能。可以说,如果用户想这样做,你应该让他们这样做。做一件合理且一致的事情很容易——例如,在散列之前用UTF-8编码。只有当某些输入设备将字符作为一个组合发送时,你才会遇到困难(例如,e+急性重音而不是“e急性”),但我怀疑这在现实生活中不会发生。(您可以自己分解所有内容,但对于edge案例来说,这将是一个很大的麻烦。)


不过,我会将其限制为可打印字符。将制表符、表单提要等放在密码中真是麻烦事。

密码中通常允许使用任何可打印的非空白ASCII字符(33到126之间)。许多安全专家(以及其他评论者)建议使用密码代替密码,因此您必须允许使用空格。争论的焦点是,由于密码的长度,而且由于字典中没有短语,密码短语比密码更难破解。(密码短语也更容易记住,因此合法用户不必将其写在监视器上的便笺上。)


有些使用散列,所以我对长度设置了一个非常高的限制(512或1024),只是为了包含在内。今天的密码生成器通常会生成32-128个字符的字符串,但谁知道在未来几年会使用什么哈希值呢。

如果您要防止SQL注入类型的攻击,那么最好确保您的代码执行它应该执行的操作,而不是依赖于限制输入,使问题变得更容易


对于非ascii字符,如果您的输入可以正确地表示为二进制字符串(而不是文本),然后传递给哈希函数或键生成器等,我不认为这是一个更困难的问题。

基本上,大多数unicode类字符都应该被允许。但不要跳过控制字符(例如,除空格外的0-31)、字节顺序标记(0xfffe和oxfeff)。此外,您希望首先规范化表示,以消除由不同表示引起的问题。您可能会对似乎太难输入的字符发出警告,但用户自己会对此加以防范。

简短回答:允许尽可能多的系统支持。现在真的没有理由不使用对文本输入的完全unicode支持,这包括密码。我不认为你需要担心字符的问题,只要它们是按字面意思处理的(但我不是这个领域的专家——小心sql注入)

我对那些限制密码的网站很反感。。。任何形式的限制。我喜欢的网站会告诉你你的密码有多强,并建议你加强密码,但强迫用户键入至少8个字符,或要求同时输入字母和数字等,这是非常令人沮丧的


如果您需要有一个最大字段大小(例如存储在数据库中),请尝试将其设置为足够大,以便人们手动键入任何内容。实际上没有太大的密码字段,因为总是有可能使用自动生成的强密码,但是64到128个字符就足够了。

请记住:在存储密码时,所有密码都应该使用单向算法加密,如sha1的md5。因为这些算法总是产生十六进制数,所以您不需要担心SQL注入之类的问题

因此,只要您可以md5或sha1字符,它就应该被接受。

为“让用户包括其界面允许其输入的任何和所有字符”添加另一个投票。我甚至不允许使用制表符或控件字符。您的软件能够接受任意字节字符串并对其进行哈希,因此可以接受任意字节字符串作为密码。否则会减少攻击者在暴力或字典攻击中必须搜索的空间


(当然,即使你允许一切,99%的用户仍然会使用他们宠物的名字作为密码…

最终,你可能需要在发送给用户的确认电子邮件中打印出清晰的密码

PS:可以考虑在电子邮件中编码问题,如果不是标准ASCII(例如日语字符),用户可能不会以正确的格式接收电子邮件,或者由于字体未被安装而无法在另一个系统上读取。


所有这些都在“可打印”ascii字符范围内。

只要它以相同的方式对其进行散列,就不会有问题,对吗?问题是人眼无法识别/识别字符,这将使跟踪/调试变得困难。制表符具有特殊的“自动完成”功能