密码存储在内存中是不是安全?

Posted

技术标签:

【中文标题】密码存储在内存中是不是安全?【英文标题】:Are passwords stored in memory safe?密码存储在内存中是否安全? 【发布时间】:2015-06-22 13:12:31 【问题描述】:

我倾向于将用户密码存储在内存中以备后用。

var credentials = ;
function register(username,password)
    //when users click sign up
    credentials.username = username;
    creadentials.password = password;

function login()
    //Users can click login at anytime. Or they just don't.
    ajax('/User/login',credentials).then(function()
        credentials = ;
    );

我应该担心这种方法的安全任务吗?如果这是一个坏主意,攻击者将如何找回密码?

【问题讨论】:

我可以从扩展程序、书签、iframe 或许多其他入口点写alert(window.credentials.password) :) 当然,假设你没有在creadentials 上打错字;) 是的,使用普通的旧 HTTP,它们将以纯文本“通过网络”发送,任何人都可以看到...... @RGraham 我没有在我的应用程序中使用任何外部脚本。 @Tresdin 我可以在 Chrome 中安装扩展程序。或者干脆在某人的机器上打开一个控制台并输入该命令 你为什么要这样做?应立即将密码交换为某些会话令牌。如果再次需要,用户应再次键入。 【参考方案1】:

问题是您要防止什么攻击?

当试图思考某事是否安全时,请尝试列出可能的攻击者,然后看看他们是否可以攻击它。例如,在这种情况下:

设备外攻击者(基于网络):

内存中的密码在所有方面都是安全的。

设备上的攻击者,不同的用户,非管理员

内存中的密码在所有方面都是安全的,因为操作系统限制会阻止攻击者访问内存块。

设备上的攻击者,同一用户,非管理员

如果攻击者可以使用与您的代码相同的用户帐户访问系统,则内存中的密码可能会泄露。

设备上的攻击者,不同的用户,root

这个和上面一样,密码可以泄露。

但是,这里有一个重要的问题。如果攻击者可以以同一用户或 root 身份获得访问权限,那么您将遇到更大的问题。例如,他们可能会篡改您的代码以远程将所有密码(输入时)发送给他们。

所以在实践中,无论哪种情况,密码都会泄露。

但有一个主要例外。想象一下,您在应用程序中遇到了段错误。操作系统需要一个核心转储。如果您以纯文本形式存储密码,则密码以纯文本形式存储在该核心转储中。这是一个相当严重的问题。

推荐

实际上,任何可以读取纯文本密码的攻击者都可以做其他令人讨厌的事情,但我们希望练习深度防御。这意味着向攻击者提供多个减速带。我们不想让他们的事情变得容易。

所以我建议不要将纯文本密码存储在内存中。如果您稍后需要纯文本密码(用于登录远程系统或其他东西),我建议您重新构建不(使用 OAuth2 或另一个联合身份验证系统)。但如果必须,至少使用未存储(或至少保存)在内存中的密钥对其进行加密。

更好的是单向散列它,就像存储一样(使用 bcrypt、scrypt、pbkdf2 等)。

【讨论】:

【参考方案2】:

攻击者可能访问纯文本密码的每个点都是一个问题。另一方面,这将是可攻击的场景,而替代方案并非极其罕见(尽管我能想到一些)。

无论哪种方式,您似乎希望做的是允许用户在注册后登录,可能是在等待确认邮件得到验证的同时?在这种情况下,最好将用户名和密码存储在 服务器端 内存中,因为它仍然可以为您提供所有相同的优势,而不会有突然被发现的危险。理想情况下,您不要将密码存储在服务器端内存中,只存储用户名和密码正确的标志/时间戳

【讨论】:

【参考方案3】:

无论如何,无论多么短暂,您都会将密码“保存在内存中”。它停留的时间越长,被嗅探的机会就越大。但是,如果有人一开始就可以从您的记忆中嗅出密码,那么您已经受到了超出希望的损害。因此,无论您是否将其保留更长时间,都没有什么区别。

这可能会或可能不会说明您的 AJAX/REST 基础架构的其余部分的安全性,也许您一开始就不应该使用纯文本密码。例如,转移到初始认证后不需要明文密码的令牌系统。但从我们看到的 sn-p 来看,这太宽泛了。

【讨论】:

“无论多么短暂”确实有很大的不同。如果用户离开计算机,@RGraham 可以走到他们的办公桌前窃取密码。如果在 Ajax 请求期间它仅在某个范围局部变量中,则不会有问题。 很公平。如果您在函数中限定变量,那么无论如何都很难访问。如果不提供物理安全性,那么您几乎无法保证(例如硬件键盘嗅探器)。

以上是关于密码存储在内存中是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

在会话中存储密码是不是安全? [复制]

将密码存储在 cookie 中是不是安全?

在 C# 中存储使用 MD5CryptoServiceProvider 散列的密码是不是安全?

在客户端散列密码是不是具有安全意义

以 html 帖子形式存储重置密码令牌是不是安全?

存储哈希密码字节而不是字符