不少人都觉得限制密码最大长度不仅烦人而且没有道理,但如果你问我是不是应该取消这些限制规则,答案是不应该,长度限制是有其背后的逻辑的。
人们喜欢在 Twitter 上抱怨密码最大长度的限制,甚至在 Stack Overflow 上有人说限制最大长度毫无道理,反而会给服务带来安全风险。更糟糕的有一点在于大家似乎普遍认为最大长度限制的本身就是个错误,而不是最大长度限制被设置的过低(说真的,有的网站竟然把最大长度设为6)。
有密码最大长度其实是件好事,长密码拒绝服务(long password denial of service)这事可是真实存在的,因为服务器端所使用的哈希算法可能会达到长度极限。更重要的是,有了已知的最大密码长度能让你可以测试所有的密码字段。
最后一句话听起来可能有点奇怪:我干嘛去测试自己的登录系统呢?即使要测试为什么又要用长密码来测试呢?但我们需要考虑到这个密码可能出现的所有场景。
显而易见的我们在登录界面上需要输入它。登录框可能是在网站上,桌面程序上或者手机应用上。但你知不知道这些密码输入框到底允不允许用户输入(或者粘贴)1000个字符呢?
除了登录,注册页面上也需要连续输入两次密码,还有一堆其它的信息,这里面可能有文字,可能有图片——这里的问题是,你的注册表单能处理2000个字符的密码吗?还有密码重置页面,首先用户需要键入旧密码,然后连续两次键入新密码,这有可能就是3000个字符的数据量。
在用户和密码存储中间也有我们应该考虑的地方。Web 应用程序的防火墙允许用户发送这么多数据吗?你的应用程序和它使用的框架能接受长密码吗?你的哈希算法是如何处理长字符串的?另外,你页面上的密码输入框允不允许用户输入比登录界面还宽(长)的密码?
如果你不测试你的程序看它是否能处理你为其设置的最大长度密码,那么你就不能100%确定这个最大长度在整个系统中都有效:或者是前端的界面上出了问题,或者它会被防火墙拦截,或者它在后台不能被正确加密... 可能出现的问题很多,但测试的第一步就是要去定义它的最大长度。
现在进行到这一步,我们都了解了定义最大长度的意义,但这个长度应该是多少呢?开放式 Web 应用程序安全项目 OWASP 身份验证备忘单 提供了关于正确密码强度控制的建议:
实现适当的密码强度控制(摘要)
强制规定最小密码长度为8以阻止弱密码
切勿将最大长度定义过低
不要截断密码
允许出现所有字符(包括 Unicode 和空格)
添加密码强度量表
不允许使用过于常见或曾被泄露的密码
在设置密码的最大长度时,你需要牢牢记住建议中的两个要点,一是最大长度应该是多少,二是不要截断用户的输入。最大长度的数值应该足够高(至少为100),因为任何密码管理工具都不太可能生成这个长度以上的密码。
如果密码的最大长度被设置为100个字符,那么每个密码输入框应该至少允许用户输入101个字符,为什么呢:万一用户使用了工具生成200个字符的密码,在键入第101位时你就可以弹出提醒,告诉用户密码已经超过长度。
现在大家就可以去试试,在你正在创建的工程里设置一个最大密码长度吧。
微信搜索 “ng_4bytes” 关注4字节官方微信号,获取技术界一手资讯,更有海量程序员培训课程等你参加!返回搜狐,查看更多