2

因为 Java 字符串对象是不可变的并且垃圾收集器是异步的,所以将身份验证信息存储在字符串中会阻止一种有利于线程安全的安全性。

安全处理此类信息需要可变性,即将以前用于存储敏感信息的内存清零。

假设您可能正在使用带有 HeartBleed 漏洞的 openssl 版本。

一个简单的身份验证实现是否会导致 JVM 内存中充斥着用户名和密码?

如果您不能先​​验地知道信息不敏感,是否应该完全避免使用 java.lang.string?

作为一个附带问题,JVM 可以做些什么来降低风险?我不知道有一个开关是“尽快零填充回收内存”。

4

1 回答 1

4

我不是加密专家,但我认为这取决于您对威胁模型的评估。

如果您可以假设攻击者可以读取内存的随机部分,老实说,我不确定您如何设计一个密码安全系统。毕竟,只要您将密钥拉入内存,攻击者就可能能够提取您的密钥。如果您假设攻击者可以做到这一点,那么设置额外的保护措施以尽快清除内存不会改变您的系统仍然易受攻击的事实。提前了解系统时间的攻击者可以闯入系统。

如果您不认为攻击者可以做到这一点,那么将旧字符串保存在内存中的安全问题就不那么重要了。Java 的语言级安全特性应该确保能够破坏 JVM 的攻击者无法看到过期的字符串对象。如果您不信任 Java 的实现来保护这一点,那么我认为 JVM 的故障比字符串对象的故障更多。

更一般地说,我认为要问的第一个问题是您可以假设攻击者可以做什么。如果您认为您的系统可能容易受到有人扫描 RAM 内容的攻击,那么我认为您遇到的问题比垃圾收集器运行速度不够快要大得多。如果您认为某人可能能够运行任意 Java 代码,那么我认为这不是问题。如果您认为有人可能会冻结计算机并将其带到实验室检查 RAM,我认为您需要担心更大的问题。

希望这可以帮助!

于 2014-06-07T18:59:07.170 回答