用节点散列存储在Couchbase服务器中的密码


在进入数据库之前,应该对WAll密码进行哈希运算,因为您必须考虑一些恶意用户试图进入您的数据的情况。密码是你不想让别人看到的敏感信息。

现在,让我们不要混淆加密和散列。加密某样东西假设它以后可以被解密。尽管这比以纯文本形式离开要好,但我们真正想要的是无法解密的东西。这就是哈希给我们提供的。

用加密散列

对于这个例子,我们将使用更流行的bcryptjs但是,它遵循与其他标准加密库相同的规则。您传入一个字符串进行哈希运算,通常还会传入一个盐。

对于加密的例子,您可以按照文档进行如下操作:

var bcrypt = require("bcryptjs");
var salt = bcrypt.genSaltSync(10);
var hash = bcrypt.hashSync("my-password", salt);

由此产生的散列将不可读,因此存储在数据库中是安全的。但是,在需要实现用户登录的场景中,如何比较密码呢?

对照保存的密码进行验证

加密库总是有一个比较纯文本密码和散列的功能。这就是在用户登录的情况下验证密码的方法。

bcrypt.compareSync("wrong-password", hash);
bcrypt.compareSync("my-password", hash);

以上两行基本上取自文档。在第一行,比较将失败,并向用户返回false。在这种情况下,你知道值是错误的,甚至不知道什么是哈希密码。在第二行,密码匹配,你会得到一个真实的回应。

一个实例

让我们从上面学到的东西做一个有效的例子。在某处创建一个新目录,并在其中创建一个包含以下json的新package.json文件:

{
    "name": "password-hashing-example",
    "version": "1.0.0",
    "description": "An example of using the Node.js SDK for Couchbase and Bcrypt to hash passwords",
    "author": "Couchbase, Inc.",
    "license": "MIT",
    "dependencies": {
        "bcryptjs": "^2.3.0",
        "couchbase": "^2.0.8",
        "uuid": "^2.0.1"
    }
}

重要的部分是依赖性。我们包括用于散列的加密,用于通过我们的应用程序与couchbase通信的Couchbase,以及用于生成唯一文档密钥的uuid。

现在,我们需要在项目目录中创建一个名为config.json的新文件,并包含以下json:

{
    "couchbase": {
        "server": "127.0.0.1:8091",
        "bucket": "restful-sample"
    }
}

你应该把服务器和桶换成你想用的东西。

现在为了好玩的东西!创建一个名为app.js的文件,因为这是我们所有代码要去的地方。请记住,这只是一个示例,因此功能会受到限制。将以下JavaScript代码添加到app.js文件中:

var couchbase = require("couchbase");
var bcrypt = require("bcryptjs");
var uuid = require("uuid");
var config = require("./config");

var bucket = (new couchbase.Cluster(config.couchbase.server)).openBucket(config.couchbase.bucket);

var jsonData = {
    id: uuid.v4(),
    username: "nraboy",
    password: bcrypt.hashSync("my-password", 10)
}

bucket.insert("user::" + jsonData.id, jsonData, function(error, result) {
    bucket.get("user::" + jsonData.id, function(error, result) {
        console.log("Password Match -> " + bcrypt.compareSync("wrong-password", result.value.password));
        console.log("Password Match -> " + bcrypt.compareSync("my-password", result.value.password));
    });
});

我们实际上只是用散列的密码创建一个JSON文档,并将其插入到Couchbase服务器中。插入完成后,我们获取文档并比较密码。

结论

您不应该在数据库中存储纯文本密码。不管你的数据库有多安全,也不管你使用的是什么类型的数据库。通过在您的密码上使用加密哈希算法,您可以为您的用户增加巨大的安全性。

bcryptjsNode.js的库只是能够完成这项工作的许多合适的库之一。