在进入数据库之前,应该对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的库只是能够完成这项工作的许多合适的库之一。