我正在使用在线服务,由于忘记了密码,最近不得不重设密码。当我去更改密码时,我想使用带有符号!@£$%^&*()的密码。当我单击“确认密码”时,它向我显示了“ _Invaid数据”,我最终发现是由于该符号。然后,我与客户服务部进行了交谈,并告诉他们有关此问题(以及将“ _Invalid Data”替换为“ Passwords只能包含字母和数字”),他们回答说:“对不起,我们放置的准则是出于安全性考虑措施”。 (这是我听到的消息的意思)

问题是为什么他们说,当符号使密码更安全时,为什么密码不安全?确保他们将来有更好的安全性我确实教育过他们,并说,如果您的密码只有8个字符,且仅包含字母和数字,则它将允许36^8=2,821,109,907,456组合,其中包括12个符号(!@£$%^&*()_+),它将允许48^8=28,179,280,429,056字符长,表示还有一个额外的25,358,170,521,600组合,他们现在将这些信息转发到其管理器中。

评论

允许使用符号作为密码确实会增加搜索密码的空间并使其更加安全,实际上没有理由禁止使用密码。它们可能在内部使用密码,因此需要对符号进行消毒?但这将表明您应该担心的其他事情,例如将密码以纯文本格式存储在数据库中。

细化一下数学:通常密码区分大小写,因此仅允许字母和数字组合为62 ^ 8,而不是36 ^ 8。

认为将符号保留在字符集中会增加安全性是错误的。如果要增强防范暴力破解密码的能力,则可以通过将最小密码长度增加到12个或更多字符,并要求增加复杂性(包括要求所有三种类型的大小写字符和数字)来改善状况。 />
因为他们错了。

因为其中之一被称为Little Bobby Tables,他们已经吸取了教训:xkcd.com/327

#1 楼

这些“安全措施”不是为了您的安全,而是为了他们的安全。

连字符,撇号,百分号,星号,斜杠,句号等符号对于攻击者执行“注入”很有用攻击,例如SQL注入,XPath注入,文件路径注入等。网站所有者希望通过阻止这些字符来阻止您攻击其服务器。

他们应该更多地专注于适当的攻击。数据处理,例如内部使用参数化SQL和特殊字符转义,但这是一种额外的措施,可以在他们的站点中隐藏编码错误的情况下充当权宜之计。


我无法确切回答“为什么”他们这样做。也许他们有一个安全审核员,他说“将白名单字符集用于用户输入,并阻止任何非字母数字符号”。也许他们购买的Web软件包带有该限制。他们的安全副总裁可能说:“添加一些可见的措施,使我们的客户有一种我们认真对待安全的印象。”谁知道为什么?

评论


我无法确切地回答“为什么”别人做某事。也许他们有一个安全审核员,他说“将白名单字符集用于用户输入,并阻止任何非字母数字符号”。也许他们购买的Web软件包带有该限制。他们的安全副总裁可能说:“添加一些可见的措施,使我们的客户有一种我们认真对待安全的印象。”谁知道为什么?

–约翰·迪特斯
16年1月26日在19:21

好吧,严格来说,如果他们对正确的数据处理感兴趣,那么密码就不会在数据库中开头(转义或否)。将其打散,加盐,加胡椒粉,上釉,烤,粉末,最后在低火上炖15至20分钟。

–Parthian Shot
16年1月26日在20:28

嗯...密码哈希。冠军早餐。 :-)

–约翰·迪特斯
16年1月26日在20:42

他们足够聪明,可以关心SQL注入,但是认为解决方案是禁止用户密码中的某些字符吗?我在这里闻到一个脱节,就像某个地方的安全员知道足以负责(但非常粗心)大量用户数据一样。

–loneboat
16 Jan 26 '22:29



评论不作进一步讨论;此对话已移至聊天。

– Jeff Ferland♦
16年1月27日在17:41

#2 楼


问题是,为什么他们说,当符号使密码更安全时,允许符号输入不安全?


不了解为什么制定某些规则并得出结论的客户服务,或者通过使用过去的这种借口并取得成果,或者在他们的脑海中积淀出来,这将使他们成为交易对象

您的解释是正确的,因为密码的复杂性通过添加符号以及字母,大小写和数字变得更加安全了。

我会把这写成一个未经培训的客户服务代理,只是想使工作变得更轻松,或者这个人知道政策存在缺陷,只想使这段谈话尽可能短。

评论


这似乎是合理的,这正是我的想法。

–iProgram
16年1月26日在19:24

我知道在某些情况下,我们在公司工作的应聘者只是遵循诸如此类次要项目的脚本。如果更大,超出范围,他们可以轻松解决,则将其转发给适当的组。

–艾迪·史都德
16年1月26日在19:37

#3 楼

因为他们可能使用输入卫生而不是参数化查询和输出卫生。

如果他们有参数化查询,这将不是问题。如果他们知道如何对输出进行清理,那么这将不是问题。

他们的代码很容易受到很多其他事情的影响,例如基于unicode的走私。对于许多“安全的开发人员”而言,输入卫生只是将输入中的撇号删除,这是一种非常糟糕的方法。

这不能防止基于unicode的走私,并且会干扰数据库中撇号的合法用途,例如人们的名字。想象一下试图在数据库中搜索某人的姓氏,但是您不能这样做,因为存在撇号。

正确的解决方案如下:输入验证(空>长度>格式>白名单)**> **参数化查询>输出卫生(以避免XSS),这可能不是以下。没有正当理由排除适当的数据。

评论


这是一个创可贴。可能有一个奇怪的比喻:“为了保护自己免受子弹的伤害,我们将穿上镜式紧身​​衣,以使他们看不到我们!”你仍然可以照镜子...

–马克·布法罗(Mark Buffalo)
16 Jan 26 '19:43



值得注意的是(就像@ParthianShot所做的那样),特别是对于密码,他们绝不应该尝试以任何方式存储密码。密码的未隐藏值永远不要触摸其数据库或任何其他类似组件。

– CBHacking
16年1月26日在20:46

我认为输入清理可以是纵深防御策略的有效部分。考虑到Web前端团队可能与编写密码管理应用程序的团队不同。他们可能有自己的标准,要求清理所有输入,因为他们可能不信任后端团队。我们不能假设每个人总是对他们工作的系统的每个方面负责。或者他们可能正在执行规则,因为它是安全策略的书面部分(不管是哑口无言还是必须遵循策略。)这不一定是不好的兆头。

–约翰·迪特斯
16年1月27日在16:22

这确实应该是公认的答案。使用输入清理而不是参数化查询是数据库编码人员的标志,他不知道他们在做什么。

–梅森·惠勒
16年1月27日在20:38

@MarkBuffalo,简单的答案是数据完整性丢失,并且与名称带有连字符或撇号的客户之间的信誉度有所降低。像其他任何东西一样,这是一个风险权衡-您的营销团队会冒整个O'Cune家族和爱尔兰一半居民的怒火,还是您的Info Sec团队信任您的后端合同开发公司始终正确使用参数化SQL?每个查询,并正确清理输出?我知道信息安全人员会怎么说。

–约翰·迪特斯
16年1月29日,下午5:45

#4 楼

同意您的分析,即允许使用符号可以提供更高的安全性,但总的来说并没有那么多。特别是与使用稍长的密码(假设密码是完全随机选择的符号)相比时。使用95个可打印的ascii字符中的任何一个:

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\]^_`{|} ~


(如果您将Tab或换行符等字符视为可打印,则还有更多)8个字符的密码具有95 ^ 8 〜6.6 x 10 ^ 15的可能性,而仅包含(区分大小写)字母和数字的8个字符的密码具有62 ^ 8〜2.2 x 10 ^ 14的强度,弱约30倍。

仅带数字+小写+大写字母的9个字符的密码比允许特殊字符的8个字符的密码强两倍。因此,除非对密码的长度有严格的限制(实际上,至少对于少于几百个字符的密码永远不需要),否则即使使用有限的字符集,也很容易转移到稍长的密码。 br />
最大的潜在安全隐患是,如果他们认为允许密码中的特殊字符会在其应用程序或数据库中引起问题。有合理的理由排除可能导致问题的不可打印的ASCII字符(例如ASCII控制字符NUL(\b),退格键(')等),但是设计良好的应用程序应能够处理常规特殊字符,例如-A3不受注入攻击的影响。应用程序应该能够处理这些类型的字符,例如出现在带有引号或连字符的名称中(例如,Conan O'Brien,Daniel Day-Lewis)。此外,由于不应将密码保存到数据库中或将密码退还给用户并立即将其散列,因此允许可打印的ASCII特殊字符无关紧要。

当然,对于非ASCII特殊字符(例如unicode),存在一些可用性方面的考虑,对于可用性方面的考虑,禁止这些字符或以标准方式对其进行规范化可能是一个好主意。散列函数通常需要一个字符串字符串,并且具有超出ASCII特殊字符的密码可以在字节级别以不同的方式进行编码(例如,UTF-8,UTF-7,UTF-16,ISO-8859-1)。此外,除了不同的编码(可以在应用程序级别上保持一致)之外,您还必须担心unicode中外观相同的字母具有不同的值。例如,以下字符Å是unicode 00C5,但此外观相同的字符是Åunicode 212B,而实际上是两个字符-ASCII字符unicode 030a的组合字符,在A上加了一个圆。

EDIT:我刚刚注意到您将£列为您的常用符号之一。不幸的是,这不是标准的ASCII符号。在ISO-Latin-1中,它是字节C2 A3。在UTF-8中,这是两个字节+AKM-。在UTF-7中,它是ASCII字符00 A3。在UTF-16中为'。这些不同的编码意味着,如果处理不正确,则散列函数可能会破坏此字符。当然,该应用程序应该能够正确处理编码,但是在某些设备子集上可能会失败。此外,该字符可能无法在外国键盘上使用。在密码上下文中完成)。

最后,还有一种独特的密码规则,那就是让用户拥有一个记住的密码,该密码在任何地方都可以重复使用,这是一种可怕的安全做法,这使用户更难。如果用户的“普通”密码不符合一个站点的唯一规则,则当他们的普通密码在某个随机的其他站点上遭到泄露(即以明文形式存储密码)时,该用户的帐户不会在该站点上被唯一口令破坏。规则。

评论


我个人更喜欢使用从较小字母中选择的较长密码。在我能解决的任何地方,我都只在密码中使用字母数字字符。即使您从整个可打印的ASCII字符到小写字母,也仅意味着您需要40%长的密码才能拥有尽可能多的密码。

–卡巴斯德
16年1月26日在21:39

如果智能引号试图跟踪由文字处理器应用程序生成的文档中的密码,该文档喜欢将ASCII单引号和引号字符转换为等效的“智能引号”,则它们可能会咬人。当然,他们不应该为此目的使用此类应用程序,但是它们确实可以使用。因此,我不会反对将它们以及反引号排除在外。

– Monty Harder
16年1月26日在22:27

#5 楼

有点久了,但是...

说,约翰的母亲得到了圣诞节的IPad,然后她决定使用它(而不是笔记本电脑)登录她的银行,但无法解决在iPad上“键入”符号。因此,她要求某人向她展示如何键入密码.....

现在考虑客户拥有不知道如何在手机或平板电脑上“键入”密码的客户的支持问题。许多要求重新设置密码的支持电话既是安全问题,也是成本问题。

评论


因此,为什么像此服务一样在网页上有“忘记密码”链接。

–iProgram
16年1月27日在13:28

@iProgram的“忘记密码”链接也会导致支持问题,如果需要安全访问,则不能仅通过电子邮件将电子邮件发送给该人。

–伊恩·林格罗斯(Ian Ringrose)
16年1月27日在14:10

诚然,在移动设备上键入某些字符可能会非常棘手,并且比其应有的麻烦还要多。我知道在拥有智能手机之前经常使用的密码对手机非常不友好。如今,我可以看到人们创建的密码包括六个Emoji或外来Unicode与其他字符的混合...从简单易用的角度出发,将它们限制为标准ASCII确实很有意义。

–达雷尔·霍夫曼(Darrel Hoffman)
16年1月27日在17:58

现在,我通常使用小写字母,例如在智能手机上,键入两个小写字母,然后输入1个数字或大写字母所花的时间一样长。

–伊恩·林格罗斯(Ian Ringrose)
16年1月27日在18:17

#6 楼

某些符号可能无法在您与之交互的所有键盘布局上使用。这将阻止您登录。这将是可用性问题,而不是安全问题。

但是,如果您在陌生的键盘布局上可以使用该符号,这可能会成为一个轻微的安全问题。正在合作,但位置不熟悉。在这种情况下,您可能必须先找到正确的密钥,然后再将其输入密码字段。并且(尤其是在没有匹配的键帽的情况下),可以想象在一些编辑器中键入符号,直到出现要搜索的符号。当您停在那里时,一眼就能看到您的编辑器的人(在您键入或稍后输入该内容是因为您忘记关闭它)会知道您密码中包含的至少一个符号。

我有同意Eddie Studer的回答:即使存在牵强附会的安全隐患,告诉您此事的人也可能不知道该政策背后的真正原因。但是,这可能是我前面提到的可用性问题,例如用户无法登录。来自国外的网吧。只是为大多数其他答案表示的注射问题提供一种替代方法,即使这些仍然是很可能的原因。

评论


在我工作过的公司之一中,我们的用户设法以某种方式在他的密码中添加了制表符。然后我们收到了错误报告,指出他无法输入密码。因此,限制字符集并不一定是个坏主意。

–el.pescado
16年1月27日在18:23

@ el.pescado如何在标签中放入密码?它只是使您进入网站或浏览器的下一个字段,不是吗?还是输入\ t?如果是这样,那么密码之前就没有被清理过。

–iProgram
16年1月27日在22:37

如果您要从文本文档中复制粘贴密码,并在其中包含标签,则可以在密码字段中完全使用它。

–FélixSaparelli
16年1月28日在10:29

在某些情况下,您可以按CTRL-I输入制表符。但是,值得注意的是,这在IE中不会发生(我相信它会尝试在此处创建到当前页面的书签)。

–丹·亨德森(Dan Henderson)
16年1月31日在6:28

#7 楼

大多数人在不放慢速度并同时按下多个键的情况下不能键入符号,因此,如果您尝试键入可能被人看到的位置,则安全性会有所降低。

评论


但是,当您像我一样使用密码管理器时(我敢肯定还有很多其他人),它会使您的速度变慢。这是因为您要么必须删除自己的符号,要么需要更改密码类型,这会使密码安全性降低,因为密码较短。

–iProgram
16年1月27日在13:06

@iProgram大多数人不使用密码管理器,并且大多数密码管理器允许您更改密码或生成不带符号的密码。

– Pete Kirkham
16年1月27日在13:09

使用我的密码管理器,我可以过滤掉符号,但是它会使密码更短,因此安全性降低。

–iProgram
16年1月27日在13:27

@iProgram,然后是您的密码管理器,这会使密码的安全性降低。

– Pete Kirkham
16年1月27日在16:31

@iProgram如果您的密码管理器不允许您存储任何字符和任何长度的密码,那将是一个非常差劲的密码管理器,并且这种限制与我的观点无关。

– Pete Kirkham
16 Jan 27'20:59



#8 楼

您的论点是:
1。具有符号的随机生成的密码要强于仅由字母和数字组成的相同长度的随机生成的密码
2。因此,允许密码中的符号使其更强壮。

只有当人们随机生成密码时,此方法才有效。
让我们将使用以下算法创建的密码进行比较:
1。创建最大长度的密码-1,其中包含数字和字母
2。在符号末尾粘贴一个符号

假设符号的数量少于字母和数字的数量,这将产生比仅包含字母和数字的随机密码要弱的密码,并提供错误的密码安全感(我将其设置为password $,而不是password!)。可以使用类似的参数来通过用符号等替换字母来生成密码。

因此,人们可能会决定禁止使用符号,以希望人们选择使用随机/更长的密码,而不是pa$$word 。当然,这会“破坏”想要使用带有字母+数字+符号的随机密码的用户。但是您希望这些用户会受过足够的教育,只需添加更多字符,就可以得到强度相同的密码(假设您没有限制长度)。

总而言之,仅因为在某些密码中包含符号会增强其强度,所以并不能因此而允许人们使用符号会增加普通密码的强度。

#9 楼

除了他们自己的安全性之外,假设您必须记住包含大写和小写字母,数字和特殊字符的密码,大多数寻求它们的人会将密码写在纸上,并且可能与他们的登录信息一起考虑了。高安全风险
如果您使用更简单的密码就可以记住,那么从您那里泄漏的可能性就大大降低了
当然,这样一来,它们会阻止您使用带有密码管理器的复杂密码的能力,因此解决方案比一张纸,但是我仍然认为它比简单地记住您的密码或密码不太安全
,但是如果没有内部人员的话,要告诉他们是否有合理的理由或者只是他们的系统或管理存在缺陷

评论


一个常见的过程是考虑一个密码短语,并从中得出实际的密码。您会记住该短语,但使用的密码要保密得多。 “昨天晚上-我早餐吃了五个鸡蛋!” ->“ Yn-Ih5efb!”

–DevSolar
16 Jan 27'9:09



这就是问题,我使用密码管理器。因此,我必须使用较短的密码,我必须重复两次以确保安全(破解需要15小时,但重复破解则需要377bill年)。我采取了一些额外的措施,例如,以防万一黑客拥有强大的硬件,或者他们拥有了“捐赠”的力量,而这种力量是可能的。

–iProgram
16 Jan 27'在10:53

由于可以导出密码列表,因此重复输入的较短密码并不比原始的短密码安全得多。请使用更长的随机密码。

–FélixSaparelli
16 Jan 28'在10:33



#10 楼

XML / Json假设:

密码可能已发送到Web服务(希望通过安全通道),他们发现特殊字符导致无效的XML或Json。他们没有转义实体,而是限制了所有符号。

一个安全问题是,如果您能够在Json中使用转义字符“ XML和\”,并且XML / Json是由String串联构建的,而没有CDATA或转义,您可能会以引号结尾即使您在String中检查了单引号和双引号也是如此。

当然,解决方案是避免使用外部参数构建查询时避免字符串连接。

P.S:密码也可以用于LDAP,从而可以进行LDAP注入

#11 楼

我避免使用密码中的符号,因为它们可能很难键入,尤其是在我不熟悉的键盘布局或设备上。

此外,更重要的是,我并不经常信任所有软件开发人员。一旦我使用了包含空格的密码。某些服务后来更改了它们的身份验证方法,以便从密码中删除空格。这使我无法登录。

我担心其他符号也可能发生类似的情况,尤其是当我们考虑使用非ASCII符号时。顺便说一句,您的客户服务不鼓励使用特殊符号的事实充分说明了不应该信任特殊符号并且它们可能会做奇怪的事情的事实(无论现在还是将来)。

毕竟,如果您考虑数字,使用符号与在字母数字密码中添加几个字符没有什么不同:


100个符号(所有ASCII可打印字符),长度8:1008个组合;
62个符号(ASCII字母和数字),长度9:629个组合,大于1008。

使用更多符号会有所帮助,但增加长度会更好(kx比xk增长得更快。

#12 楼

正如@dr jimbob所说,您在密码!@£$%^&*()中使用的不可打印字符£。如果您从密码中删除了不可打印的字符£,则将接受该服务。这是因为密码加密是使用c或Java核心级别开发的,以保持较高的安全性。


使非技术人员很难使他们理解不可打印的内容字符。因此,客户服务主管要求您使用简单的字母数字而不是特殊字符。


请尝试使用!@$%^&*()更改您的新密码,该密码在经过在线发布测试后请进行更改。

简单来说,可接受的字符在ASCII 32到126之间

评论


所有符号都发生相同的问题。连@

–iProgram
16年1月31日在10:03

然后为了避免mysql注入和@john detters所说的其他相关问题

– Shameerariff
16年1月31日,11:42

您从何处得知£是不可打印的字符?我们可以阅读的事实表明事实并非如此。而且“这是因为密码加密是在c或Java中以核心级别开发的,以保持高级别的安全性”听起来像是胡说八道。

–马丁·史密斯
16年1月31日在16:41



@MartinSmith请检查此web.itu.edu.tr/~sgunduz/courses/mikroisl/ascii.html以获得不可打印的字符列表,并检查此stackoverflow链接stackoverflow.com/questions/15836744/…以了解更多信息。

– Shameerariff
16年1月1日,下午3:54

@Shameerariff-在您的链接中,£不会出现在不可打印的ASCII字符表中的任何位置。它以扩展的ASCII字符显示。和这有什么关系呢? Java字符串本身是UTF-16。

–马丁·史密斯
16年2月1日在7:59

#13 楼

该特定序列只是按住SHIFT键并输入1234567890。因此,我假设他们不允许该特定序列,因为这对黑客来说很简单,很多人都这样做。例如,我看到人们使用QWERASDFZXCV来输入密码是不安全的,因为您只是按住shift键并向下移动键盘的左侧。

评论


我不认为OP提到禁止使用符号的顺序。

– schroeder♦
16年1月28日在23:50

#14 楼

但是,密码和用户名通常都使用有限的字符。

在安全计算中,您会遇到一些攻击面,漏洞和利用。可靠性是分开的。

是的,更多的字符更加随机,但是您的攻击面也更大。

您可以创建有限字符集的足够随机的密码。
36 ^ 8 = 2,821,109,907,456对于大多数安全需求来说是足够随机的。如果不是,则将其提高到10或12个字符。您只能希望他们使用随机字符。该漏洞存在密码,您可以猜测FistNameLastNaveYYMMDD,其中YYMMDD是生日。

某些Unicode字符看起来相同。您可以创建一个变音符号作为单独的字符。这些字符不同:希腊Ο,拉丁O和西里尔字母О。

根据计算机上的字符集(代码页),您实际上可能会获得不同的映射。这个想法是跨字符集的安全的确定性字符集。

您需要考虑HTML编码,网络压缩,加盐等等。控制字符呢?

您必须在某些地方画线,事实是您不需要大的字符集即可创建足够随机的密码。

这与程序员懒惰或不足。这是关于提供可靠的可靠代码。使用受控字符集可以更好地测试所有可能性。如果在传输过程中发生了一些奇怪的事情,则可以使用一个较小的测试集来找出破坏它的原因。