保存外部系统凭据的最佳方法

时间:2017-11-26 22:51:05

标签: mysql node.js express authentication

我正在使用提供基本用户名和密码身份验证的应用来访问其API。对此api的特定访问将基于用户和他们在外部应用程序中的权限。存储这些外部凭据的最佳方法是什么,将它们传递回应用程序的最佳方式是什么?

我目前正在使用Express和MySQL来处理Node.js。

我正在寻找可能使用的特定技术?我有点新,并试图将它们哈希并保存到数据库中,但后来我不知道如何将其发送回应用程序......

2 个答案:

答案 0 :(得分:0)

绝对尝试推动自己的安全,投资于一个适当的,经过行业考验的&经过测试的用户身份验证服务如:

喜欢,你不会后悔的。

答案 1 :(得分:0)

哈希密码将其存储在数据库中通常是您应该做的最少的事情来保证这些信息的安全。但是,对它进行散列的方式也是一种经过批准且安全的方式,因此并非所有散列算法都适用于此。有很多方法可以做到这一点,你应该总是依赖批准的东西,甚至可能是开源的东西,以便社区可以检查它是否真正安全。通常,每个操作系统都有安全包,可以正确实现这些操作,在我看来,你永远不应该尝试编写自己的东西。例如,您可以检查sha-256或sha-512实现,只是为了给您提供众所周知且经过批准的算法,我认为这些算法经常可以完成。

我问自己的问题是你为什么要将信息发送回前端,因为在大多数情况下这不应该是必要的。在数据库中进行哈希处理后,您无论如何都应该无法检索原始密码。如果要验证用户是否输入了正确的密码,您可以在后端轻松地检查该密码。这可以通过将在前端输入的凭据发送到后端来完成(这是一个安全问题,这就是为什么你应该使用像ssl这样的东西),然后使用你最初用于哈希密码的完全相同的算法来密码密码并比较这个散列与给定用户的数据库中保存的散列。这是一个简单的等于检查,告诉您凭据是否正确,因此告诉您登录是否应该成功。然后没有办法将信息bsck发送到前端。

另外,我建议为每个新密码使用随机字符串值,并在散列函数之前将其与密码结合使用以创建唯一字符串。我认为这被称为 salt 值。这样两个密码在数据库中的值不会相同,即使它们实际上是相同的密码,这使得它更安全。当您使用salt值时,您必须将其作为纯文本保存在数据库中,并使用其余的indormation,因此您可以稍后再次使用它进行相等检查。在这种情况下,您可以加载用户的salt值并再次将其与输入的密码组合,将其与算法一起散列并检查输入和保存的哈希值是否相等。如果使用相同的salt,密码和散列算法生成散列,则两个散列应该相等。

您可以做很多事情来保护这些东西,这只是一个基本的例子,说明如何以相对较少的工作量实现相对安全的登录机制。它总是取决于你想要做什么,如果它是一个简单的家庭的东西,或者可能是一个大公司的东西等等。如果它影响了大量用户需要非常安全的信息,我建议使用专业工具集或服务,专门从事这些事情。

修改

nodejs加密实现

对于散列功能,您可以检查nodejs的内部crypto service,它带来了大量功能。下面是一些代码,为您提供一个如何使用salt创建哈希的示例。

var sha512 = function (password, salt) {
    // create hmac instance with algorithm and salt
    var hash = crypto.createHmac('sha512', salt);
    // here comes the password that you want to hash
    hash.update(password);
    // get the hashed value 
    var value = hash.digest('hex');
    // keep the salt for future references
    return {
        salt: salt,
        passwordHash: value
    };
};

护照认证库

如果您想实现真正的身份验证,可以查看Jared Hansons passport库。它可以帮助您实现通常非常棘手的所有内容,例如保持用户登录,确保只有在用户登录时才能执行某些http请求,跟踪用户状态或向前端发送身份验证令牌。开始时仍然很棘手,但它仍然比你自己做的更容易。此外,他带来了大量所谓的策略,你可以安装和使用它,例如用于facebook,google等的oauth身份验证。