在Web应用程序中将输入密码与存储的哈希密码进行比较

时间:2012-12-10 16:07:08

标签: java security servlets passwords

在阅读了这个美丽的问题后:Why is char[] preferred over String for passwords?,我很好奇这是如何应用于基于servlet的Web应用程序的。假设您的UI有一些密码输入字段,密码可以通过request.getParameter("passwordFieldName")检索,返回String。即使您将其转换为char[],也必须等待GC清除String对象。

此外,我正在研究用于密码散列的许多加密/散列库都有一个方法,例如checkPassword(plaintext, hashed),它接受​​两个字符串,如果输入的纯文本字符串给出等于{的散列,则返回true {1}}。有了这个,即使你有hashed,你仍然需要使用char[]构造函数将数组转换为String。

在我看来,您无法真正避免将密码作为字符串用于将其与存储的表示进行比较。如果您担心在那个小窗口期间发生攻击,您如何保护自己?

1 个答案:

答案 0 :(得分:2)

这是一种过度反应,实际上只是“安全剧院”。实际上,没有任何情况下,在Java应用程序中使用长字符串作为密码对攻击者来说完全是理想的。如果内存耗尽攻击是一个问题,那么不要在任何地方使用字符串。

据说CWE-521表示密码必须具有最大大小。字符串实际上没有最大大小,使用char[x]是强制执行最大大小的好方法。