3

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

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

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

4

1 回答 1

2

这是一种过度反应,实际上只是“安全剧院”。攻击者根本不希望在 Java 应用程序中使用长字符串作为密码。如果内存耗尽攻击是一个问题,那么不要在任何地方使用字符串。

话虽如此, CWE-521规定密码必须具有最大大小。字符串实际上没有最大大小,使用 achar[x]是强制执行最大大小的好方法。

于 2012-12-10T17:17:27.277 回答