我有一个Maven,Spring Boot,Spring MVC,AngularJS堆栈项目。对于登录页面,我使用Spring Security来处理用户名/密码表单提交验证(来自angularJS客户端)。它工作正常,但我还需要验证输入的密码字段的长度不超过特定长度(甚至在对其进行验证之前)(我读到这在使用ByCrypt时存在一定的安全风险,因为用户可以发送非常长的密码,这需要太多时间进行哈希处理)

无论如何,有没有办法用Spring Security来做到这一点?也许我可以在CustomUserDetailService或SpringSecurityConfiguration类中做到这一点,但不知道如何做到。

最佳答案

我很好奇您在哪里阅读有关bcrypt和密码长度的信息?算法花费的时间应仅取决于成本因素。该算法使用密码创建一个18个单词的流,并反复循环遍历。因此,实际上,理论上将可用密码大小限制为72个字节。除此之外的任何事情都将被忽略。

这是一个快速测试(在Haskell复制代码中,因此不代表二进制时间)以演示:

Data.ByteString> hashPassword 5 p :: IO ByteString
"$2a$05$D2.hLTr0U1xMul/Y2Wsbjeddxp9SNumh5rAe.1oyaZUL4SceCZqUK"
(0.46 secs, 1,673,001,216 bytes)
Data.ByteString> hashPassword 5 tags :: IO ByteString
"$2a$05$bu9zO6ricNsrDTynjLm72emmiIdxulTXFGz0F11WOpSkh/R5viSmC"
(0.43 secs, 1,672,997,088 bytes)
Data.ByteString> Data.ByteString.length p
8
Data.ByteString> Data.ByteString.length tags
1274875


p是字符串“ password”,而tags是我的emacs标签文件,大小为1.2MB。如您所见,散列每个哈希所花费的时间是相同的。如预期的那样,将成本因子增加一倍,则哈希时间增加了一倍:

 Data.ByteString> hashPassword 6 p :: IO ByteString
 "$2a$06$UCIg6bMg57zvl2BM38cAeeg028oQ015Kt4V10J9OpZ3NsInOH.KJW"
 (0.87 secs, 3,311,739,024 bytes)
 Data.ByteString> hashPassword 6 tags :: IO ByteString
 "$2a$06$GpqdSvGMJ/v3H9NycKjBceKE.J9VzrwtYneIFyvlLMyAjUI71AnCe"
 (0.85 secs, 3,311,748,456 bytes)


因此,我认为该问题所基于的假设是错误的。通常,应针对您的应用程序适当限制HTTP请求的大小,但您可能不必特别担心密码的长度。

10-07 19:21
查看更多