存储在内存中的密码安全吗?
Are passwords stored in memory safe?
我倾向于将用户密码存储在内存中以备后用。
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 = {};
});
}
我应该担心这种方法的安全任务吗?如果这是个坏主意,攻击者将如何找回密码?
无论如何,您将获得密码 "in memory",但时间很短。它停留的时间越长,被嗅到的机会就越大。但是,如果有人能够从您的记忆中嗅出密码,那么您已经毫无希望地受到威胁。因此,无论您将其保存更长时间都没有什么区别。
这可能会或可能不会说明您 AJAX/REST 基础设施其余部分的安全性,也许您一开始就不应该使用明文密码。例如,转移到初始身份验证后不需要明文密码的令牌系统。但从我们看到的片段来看,这太宽泛了。
攻击者可能访问纯文本密码的每个点都是一个问题。另一方面,这将是可攻击的,而替代方案并非极其罕见(尽管我能想到一些)。
无论哪种方式,您似乎希望允许用户在注册后登录,可能是在等待验证确认邮件的同时?在这种情况下,最好将用户名和密码存储在 服务器端 内存中,因为它仍然为您提供所有相同的优势,而没有突然被发现的危险。理想情况下,您不将密码存储在服务器端内存中,只存储用户名和 flag/timestamp 密码正确。
问题是您要阻止什么攻击?
在考虑某事是否安全时,请尝试列出可能的攻击者,然后看看他们是否可以攻击它。例如,在这种情况下:
设备外攻击者(基于网络):
内存密码在所有方面都是安全的。
设备上的攻击者,不同的用户,非管理员
内存密码在所有方面都是安全的,因为 OS 限制阻止攻击者访问内存块。
设备上的攻击者,同一用户,非管理员
如果攻击者可以使用与您的代码相同的用户帐户访问系统,则可能会泄露内存中的密码。
设备上的攻击者,不同的用户,root
这个同上,密码可以泄露
但是,这里有一个重要问题。如果攻击者能够以同一用户或根用户的身份获得访问权限,那么您的问题就大得多了。例如,他们可能会篡改您的代码以将所有密码(在输入时)远程发送给他们。
所以实际上,无论哪种情况,密码都会泄露。
虽然有一个主要例外。假设您在应用程序中遇到段错误。 OS 进行核心转储。如果您以明文形式存储密码,则密码以明文形式存在于该核心转储中。这是一个非常重要的问题。
推荐
虽然实际上,任何可以读取纯文本密码的攻击者都可以做其他令人讨厌的事情,但我们想练习纵深防御。这意味着向攻击者提供多个减速带。我们不想让他们好过。
所以我建议不要在内存中存储明文密码。如果您稍后需要纯文本密码(用于登录到远程系统或其他),我建议重新设计而不是(使用 OAuth2 或花药联合身份验证系统)。但是,如果必须,至少使用未存储(或至少保留)在内存中的密钥对其进行加密。
更好的方法是对它进行单向哈希,就像存储一样(使用 bcrypt、scrypt、pbkdf2 等)。
我倾向于将用户密码存储在内存中以备后用。
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 = {};
});
}
我应该担心这种方法的安全任务吗?如果这是个坏主意,攻击者将如何找回密码?
无论如何,您将获得密码 "in memory",但时间很短。它停留的时间越长,被嗅到的机会就越大。但是,如果有人能够从您的记忆中嗅出密码,那么您已经毫无希望地受到威胁。因此,无论您将其保存更长时间都没有什么区别。
这可能会或可能不会说明您 AJAX/REST 基础设施其余部分的安全性,也许您一开始就不应该使用明文密码。例如,转移到初始身份验证后不需要明文密码的令牌系统。但从我们看到的片段来看,这太宽泛了。
攻击者可能访问纯文本密码的每个点都是一个问题。另一方面,这将是可攻击的,而替代方案并非极其罕见(尽管我能想到一些)。
无论哪种方式,您似乎希望允许用户在注册后登录,可能是在等待验证确认邮件的同时?在这种情况下,最好将用户名和密码存储在 服务器端 内存中,因为它仍然为您提供所有相同的优势,而没有突然被发现的危险。理想情况下,您不将密码存储在服务器端内存中,只存储用户名和 flag/timestamp 密码正确。
问题是您要阻止什么攻击?
在考虑某事是否安全时,请尝试列出可能的攻击者,然后看看他们是否可以攻击它。例如,在这种情况下:
设备外攻击者(基于网络):
内存密码在所有方面都是安全的。
设备上的攻击者,不同的用户,非管理员
内存密码在所有方面都是安全的,因为 OS 限制阻止攻击者访问内存块。
设备上的攻击者,同一用户,非管理员
如果攻击者可以使用与您的代码相同的用户帐户访问系统,则可能会泄露内存中的密码。
设备上的攻击者,不同的用户,root
这个同上,密码可以泄露
但是,这里有一个重要问题。如果攻击者能够以同一用户或根用户的身份获得访问权限,那么您的问题就大得多了。例如,他们可能会篡改您的代码以将所有密码(在输入时)远程发送给他们。
所以实际上,无论哪种情况,密码都会泄露。
虽然有一个主要例外。假设您在应用程序中遇到段错误。 OS 进行核心转储。如果您以明文形式存储密码,则密码以明文形式存在于该核心转储中。这是一个非常重要的问题。
推荐
虽然实际上,任何可以读取纯文本密码的攻击者都可以做其他令人讨厌的事情,但我们想练习纵深防御。这意味着向攻击者提供多个减速带。我们不想让他们好过。
所以我建议不要在内存中存储明文密码。如果您稍后需要纯文本密码(用于登录到远程系统或其他),我建议重新设计而不是(使用 OAuth2 或花药联合身份验证系统)。但是,如果必须,至少使用未存储(或至少保留)在内存中的密钥对其进行加密。
更好的方法是对它进行单向哈希,就像存储一样(使用 bcrypt、scrypt、pbkdf2 等)。