Rails Devise gem是否存在密码截断问题?是否符合OWASP标准?
我正在基于OWASP ASVS标准测试一款使用Rails框架和Devise gem实现认证的Web应用,遇到了以下问题:
2.1.3 验证未执行密码截断操作,但连续多个空格可替换为单个空格
测试时发现较长的密码存在截断问题:我设置了一个108字符的密码:
NVjEuRjiFcDGYfhm9kh9pTxUvHwKyTpNMhXqwDBHoaU3cHKv2guZJTwrUZyNN9GiJ4B8TjtiWpCWZXVsRoXmhXKEtzqJr7qnngQlfldlfdlE
使用完整密码可以正常登录,但仅用其前72个字符的截断版本也能登录:
NVjEuRjiFcDGYfhm9kh9pTxUvHwKyTpNMhXqwDBHoaU3cHKv2guZJTwrUZyNN9GiJ4B8Tjti
超过前72个字符后,无论添加、删除字符还是全部去掉,只要前72个字符正确就能登录。推测不同字符可能占用更多存储空间,甚至会进一步缩短有效认证的密码长度。
数据库中密码字段为varchar(128),这是依据OWASP标准的要求:
2.1.2 验证允许长度为64字符及以上的密码,但不得超过128字符
我原本以为用户可以输入最长128字符的密码,但该字段仅存储128字符,其中29个字符被Devise用于盐值。我对哈希/加密的原理了解不多,知道加密后的密码长度和输入长度不一定一致,但当前密码被截断的情况,似乎说明Devise没有为用户输入128字符的密码预留足够空间。
请问是我误读了OWASP标准,还是Devise存在缺陷,或是我遗漏了什么关键点?
内容的提问来源于stack exchange,提问作者Macpeters

