在阅读了这个美丽的问题后: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。
在我看来,您无法真正避免将密码作为字符串用于将其与存储的表示进行比较。如果您担心在那个小窗口期间发生攻击,您如何保护自己?
答案 0 :(得分:2)
这是一种过度反应,实际上只是“安全剧院”。实际上,没有任何情况下,在Java应用程序中使用长字符串作为密码对攻击者来说完全是理想的。如果内存耗尽攻击是一个问题,那么不要在任何地方使用字符串。
据说CWE-521表示密码必须具有最大大小。字符串实际上没有最大大小,使用char[x]
是强制执行最大大小的好方法。