考虑到您通常登录的网站有多大,似乎在某个时间点公司服务器会以明文形式将您的密码存储在内存中。这是真的吗?安全吗?
这类似于大多数大型网站让您登录的方式:
- 在浏览器中输入密码
- 使用非对称加密公钥在浏览器中加密密码
- 将密码发送到站点
- 使用非对称加密私钥解密密码
- 使用单向散列算法(和盐)散列密码
- 将散列密码与数据库中类似散列密码进行比较
- 如果哈希匹配,则登录成功。否则,登录失败。
在第 4 步和第 5 步之间查看
使用非对称加密私钥解密密码
4.5。简要地有一些带有纯文本密码的变量服务器端
- 使用单向散列算法(和盐)散列密码
这意味着虽然整个哈希方案是为了防止攻击者获取密码,即使服务器受到威胁,但熟练的黑客还是可以获取密码。
我错过了什么吗?更重要的是,是否有更安全的替代方案?
最佳答案
是的,它是“安全的”,因为内存中的任何内容都在您服务器的内存中,并且不应该能够从外部读取。
安全在引号中,因为一切都是相对的,风险级别取决于您感知的威胁模型 - 即您要防御的威胁是什么?
大肆宣传Heartbleed该漏洞允许攻击者以 64KB block 的形式从服务器内存中检索项目。但是,这里的策略是进行漏洞管理(修补过程),而不是围绕这些类型的问题进行编码。
关于加密密码 - 这是您应该依赖 HTTPS 的事情,而不是在客户端使用 Javascript 加密它们。当它们到达您的服务器存储时,并使用慢速算法(如 bcrypt、scrypt 或 pbkdf2)以散列格式比较它们。还可以使用标有安全和仅 http 标志的 cookie,实现 HSTS 策略,您应该可以在密码存储和传输方面做好准备。
CERT 关于处理内存中敏感数据的建议 is here .
与您的问题最相关的部分是:
- 禁用内存转储。
- 不要在程序中存储超出其使用时间的敏感数据。
- 不要以明文形式存储敏感数据(无论是在磁盘上还是在内存中)。
- 如果您必须存储敏感数据,请先对其进行加密。
- 安全地删除磁盘和内存中的敏感数据。
This means that while the whole hashing scheme is to prevent an attacker from gaining access to passwords EVEN IF the server is compromised, a skilled hacker could get at it anyway.
请记住,拥有安全的系统不仅仅意味着您需要拥有安全的编码实践和安全的基础设施。这是因为您永远无法拥有 100% 的安全性。这将丢失的部分难题是任何形式的入侵检测/预防 (IDS/IPS)。这认为系统会在某个时候受到损害,因此与其试图阻止每一种可能的攻击类型,不如检测它,从而允许您立即采取适当的行动。如果攻击者设法破坏您的系统并开始收集在登录过程中到达的凭据,这将为您提供保障。
关于security - 以纯文本形式在内存中短暂保存用户密码是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28524213/