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

时间:2015-04-16 08:37:10

标签: javascript security password-encryption

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

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 = {};
    });
}

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

3 个答案:

答案 0 :(得分:8)

问题是你想要阻止什么攻击?

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

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

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

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

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

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

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

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

    这与上面相同,密码可以泄露。

但是,这里有一个重要的问题。如果攻击者可以作为同一用户或root用户进行访问,那么您就会遇到更大的问题。例如,他们可以篡改您的代码,以便远程发送所有密码(当它们被输入时)。

因此在实践中,密码将在任何一种情况下泄露。

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

建议

实际上,任何能够阅读纯文本密码的攻击者都可以做其他讨厌的事情,我们希望深入实践防御。这意味着为攻击者提供多个speedbump。我们不想让事情变得简单。

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

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

答案 1 :(得分:2)

攻击者可能访问纯文本密码的每个点都是一个问题。另一方面,这将是可以攻击的情况,而替代品不是非常罕见的(虽然我可以想到一些)。

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

答案 2 :(得分:1)

您将在内存中使用密码""无论如何,无论如何。它徘徊的时间越长,被嗅闻的可能性就越大。但是,如果有人能够开始从你的记忆中嗅出密码,那么你已经超越了希望。因此,无论是否保持更长时间,它都没什么区别。

这可能会或可能不会说明您的其他AJAX / REST基础架构的安全性,也许您不应该在那里使用明文密码。例如,移动到令牌系统,其中在初始认证之后不需要明文密码。但是从我们看到的片段来看,这太宽泛了。

相关问题