如何在 Node.js 的本地/自定义数据库中安全地存储密码?
自定义数据库表示文件系统中的本地数据库。有两种类型的数据库“SQL”和“NoSQL”。在 SQL 数据库中,数据以表格方式存储,而在 Nosql 数据库中,数据以某种特定的方式独立存储,以独立识别每条记录。我们也可以通过 Nosql 方式在本地创建自己的数据库或数据存储。
有一些步骤涉及创建本地数据库并向其中添加记录。这些步骤如下:
- 使用以下命令在项目目录的根目录中创建 package.json 文件:
npm init -y
- 使用以下命令安装 express 和 body-parser 包
npm install express body-parser
- 创建一个 GET 路由以显示表单(将信息提交到数据库的 HTML 表单)。
- 创建后续的 post 路由来处理表单提交请求。
- 将服务器设置为在特定端口上运行(开发人员的端口 - 3000)。
- 创建一个存储库文件并添加与创建数据库相关的所有逻辑。
- 散列和盐原始密码。
- 将记录与加密密码一起存储到本地数据库中。
示例:此示例说明如何在本地数据库中安全地存储密码(Hashed+Salt)。
文件名:index.js
const express = require('express')
const bodyParser = require('body-parser')
const repo = require('./repository')
const app = express()
const port = process.env.PORT || 3000
// The body-parser middleware to parse form data
app.use(bodyParser.urlencoded({ extended: true }))
// Get route to display HTML form
app.get('/signup', (req, res) => {
res.send(`
`)
})
// Post route to handle form submission logic
// and Add data to the database
app.post('/signup', async (req, res) => {
const { email, password } = req.body
const addedRecord = await
repo.create({ email, password })
console.log(addedRecord)
res.send("Information added to the "
+ "database successfully.")
})
// Server setup
app.listen(port, () => {
console.log(`Server start on port ${port}`)
})
文件名:repository.js此文件包含将具有安全密码的新记录添加到数据库的所有逻辑。
// Importing node.js file system,
// util, crypto module
const fs = require('fs')
const util = require('util')
const crypto = require('crypto')
// Convert callback based scrypt method
// to promise based method
const scrypt = util.promisify(crypto.scrypt)
class Repository {
constructor(filename) {
// The filename where datas are
// going to store
if (!filename) {
throw new Error(
'Filename is required to create a datastore!')
}
this.filename = filename
try {
fs.accessSync(this.filename)
} catch (err) {
// If file not exist it is created
// with empty array
fs.writeFileSync(this.filename, '[]')
}
}
// Method to fetch all records
async getAllRecords() {
return JSON.parse(
await fs.promises.readFile(this.filename, {
encoding: 'utf8'
})
)
}
async create(attrs) {
const records = await this.getAllRecords()
const { email, password } = attrs
// SALT
const salt = crypto.randomBytes(8).toString('hex')
// HASHED buffer
const hashedBuff = await scrypt(password, salt, 64)
// HASHED and SALTED password
const hashedSaltPassword =
`${hashedBuff.toString('hex')}.${salt}`
// Create new record with hashed and
// salted password instead of raw password
const record = {
...attrs,
password: hashedSaltPassword
}
records.push(record)
// Write all records to the database
await fs.promises.writeFile(
this.filename,
JSON.stringify(records, null, 2)
)
return record
}
}
module.exports = new Repository('datastore.json')
文件名:Package.json 文件
提交回复的表格
注意:这里两个响应一个接一个地提交,所有响应都存储在 datastore.json 文件中。
提交请求后重定向页面
使用以下命令运行index.js文件:
node index.js
输出:
数据库:
注意:第一次运行程序的数据库(datastore.json)文件在项目目录下不存在,运行程序后动态创建并存储提交的响应。之后,所有提交的响应都会被一一追加到数据库中。