Java中的String被保存了一段时间,可能是很长时间。这是一件好事,除非String包含用户的实际密码。字符数组被建议,因为它们不是不可变的,可以更快地清除。(让我们希望不会有“苦涩的咖啡”攻击,它的工作方式就像“心脏出血”,但却针对JVM (远程堆转储))。
我注意到Security使用的是CharSequence而不是字符串,可能是因为这个原因。但是,我不确定应该使用哪个对象来将密码保存在内存预散列中。StringBuilder合适吗?那会是什么样子?我甚至不太确定我是否正在创建REST (通过Spring数据或Spring与Jackson一起创建),如何避免它成为String。
我如何编写一个JSON,以便在尽可能安全的同时创建/更新密码,并避免使用String的各种问题?
发布于 2015-07-06 15:00:22
我如何编写一个JSON,以便在尽可能安全的同时创建/更新密码,并避免使用String时出现的各种问题?
API密钥不是真正的密码。您可以控制API键是如何创建的,因此可以创建一些随机字符串,这些字符串将具有非常低的冲突(即双UUID)和非常低的公共子字符串(在去达普的情况下)。在客户端使用密钥登录REST之后,您可以使用临时令牌,从而提高API密钥被垃圾收集的可能性。
至于处理真正的密码,这是人类登录(也许是为了重置API键)的情况,考虑到几乎每个servlet容器都会将请求参数转换为字符串,您实际上没有太多的选项。一个俗气的选项是让客户机通过Javascript (或您的客户机是什么) Base64对密码进行编码,然后添加一个分隔符,然后向密码中添加一个随机生成的数字或字符串。这并不是为了混淆,而是为了降低保持相同字符串的可能性。当然,您必须小心地将代码解码为char或字节数组,然后通过操作char或字节数组删除随机后缀(请参阅CharBuffer)。
另一个复杂的选择是微服务云方法。只需创建一个身份验证服务,该服务由几个只进行身份验证的小循环实例组成。让这些JVM实例频繁地重新启动(以刷新内存)。或者,如果他们足够小,他们希望垃圾收集更频繁。
当然,我将假设您的数据存储库已经存储了密码(否则,这种安全预防措施将毫无意义)。
老实说,还有很多其他的威胁,我认为在HTTP服务器环境中,对于大多数用例来说,这是不值得的。
Java之所以使用char[]作为密码,是因为Swing用于桌面环境。桌面环境更有可能有恶意程序,如病毒/间谍软件,这些程序可能会对密码进行内存探测。
考虑到这一点,这确实是你应该担心的客户端,而不是服务器。
https://stackoverflow.com/questions/31238571
复制相似问题