数据加密之md5
我们知道在互联网上数据是存在一定的安全隐患的,一旦数据泄露,就有可能造成损失。
就比如我们某一个账号的密码是不愿意被别人知道的。当我们注册的时候,我们的信息将保存在一个数据库里面,如果数据库里面的数据被泄露,那么我们的账号密码就直接可以看的一清二楚。
为了数据安全,就算是别人获取到了数据库,也看不懂某些数据,我们可以使用
md5信息摘要算法
来对数据进行加密处理。
其实md5不算是加密,只是获取信息的摘要值,提取信息的特征值。
md5的特征:
- 单向不可逆(即可以通过md5将一个明文生成一个密文,但是不能通过密文反推得到明文)
- 相同的输入得到相同的输出(即输入相同的明文得到相同的密文)
- 混淆信息
Node.js之md5的使用
- 安装
npm install md5
- 引入
- 使用
使用示例
// 引入md5
const md5 = require('md5');
// 明文msg
var msg = "123456";
// 对msg进行md5加密,得到密文cipherMsg
var cipherMsg = md5(msg);
// 打印明文和密文
console.log("明文:" + msg);
console.log("密文:" + cipherMsg);
但是这样得到的密文其实还是可以使用网上的一些工具来进行解密,即可以将密文反推出明文,这样一来其实上面的方式进行加密并不安全,所以在开发中我们可以对其进行二重加密。
例如将上面的密文拿到网上进行解密,就可以反推到了明文:
为了更加安全,对其进行二重加密。
// 引入md5
const md5 = require('md5');
// 明文
var msg = "123456";
// 对msg进行md5加密,得到密文cipherMsg
var cipherMsg = md5(md5(msg));
// 打印明文和密文
console.log("明文:" + msg);
console.log("密文:" + cipherMsg);
此时可以发现我们的明文还是一样的,但是因为使用了二重加密,得到的密文就不一样了。
但是别以为这么简单就可以了,其实上面的二重加密还是一样的可以被反推。
所以,我们可以在二重加密的基础上,在第一次加密后得到的密文拼接一个随机字符串,越随机越好,再进行第二次的加密。我们一般将那个随机字符串叫做
salt
,这个
salt
千万要自己保存好并且不要泄露出去。
// 引入md5
const md5 = require('md5');
// 明文
var msg = "123456";
// salt
const salt = "fweahryq3$(#^dgdga3.+=-nfkhsdk646sfhshw%%}[ervdg";
// 对msg进行md5加密,得到密文cipherMsg
var cipherMsg = md5(md5(msg) + salt);
// 打印明文和密文
console.log("明文:" + msg);
console.log("密文:" + cipherMsg);
此时,我们发现,还是相同的明文,但是得到的是不同的密文。我们再将这个密文拿到网上的解密工具进行反推测试。发现是无法反推得到明文的,除非你的
salt
被泄露了。
那么,如果我们使用上面的方式对新注册的账号密码进行加密并且放入了数据库中,我们登陆的时候,输入的是明文密码,应该怎么与数据库里面的密文密码比对呢?
你可能会想到,首先将根据用户名得到对应的密文密码,然后在将密文密码转成明文密码,再与我们登陆时输入的明文密码比对,比对成功就登陆成功,比对失败就登陆失败。但是我们上面已经讲过,md5是单向不可逆,并且我们已经进行了二重加密,还使用了salt,是不好进行直接的转成明文并且比对的。
对此,我们应该转换一下思路,登录时输入的明文密码,先转成密文密码,在将该密文密码与数据库里面的密文密码进行比对,这样一来如果比对成功就登陆成功,如果比对失败就登陆失败。
那么该怎么实现呢?我们演示一下。
- 输入与注册时相同的明文密码
// 引入md5
const md5 = require('md5');
// salt
const salt = "fweahryq3$(#^dgdga3.+=-nfkhsdk646sfhshw%%}[ervdg";
// 数据库密文密码
var password = "48da250f5b5e71f24ed3b8048ea4fde5";
// 登录时输入的明文密码
var msg = "123456";
// 由于注册时密码进行了二重加密并且使用salt
// 那么为了比对成功,应该也进行相同的加密过程
// 登录时输入的明文密码加密成密文密码
var psw = md5(md5(msg) + salt);
// 比较psw是否与password一致
if(psw == password){
console.log("密码正确");
}else{
console.log("密码错误");
}
- 输入与注册时不相同的明文密码
// 引入md5
const md5 = require('md5');
// salt
const salt = "fweahryq3$(#^dgdga3.+=-nfkhsdk646sfhshw%%}[ervdg";
// 数据库密文密码
var password = "48da250f5b5e71f24ed3b8048ea4fde5";
// 登录时输入的明文密码
var msg = "654321";
// 由于注册时密码进行了二重加密并且使用salt
// 那么为了比对成功,应该也进行相同的加密过程
// 登录时输入的明文密码加密成密文密码
var psw = md5(md5(msg) + salt);
// 比较psw是否与password一致
if(psw == password){
console.log("密码正确");
}else{
console.log("密码错误");
}
文件上传之multer
可以参考:
https://www.npmjs.com/package/multer
Multer 是一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,它主要用于上传文件。
multer的使用
- 安装
npm install multer
- 基本使用
const express = require('express');
const multer = require('multer');
const path = require('path');
const fs = require('fs');
const app = express();
const port = 3000;
// 保存文件的路径
const uploadPath = path.join(__dirname, './public/uploads/img/');
// 磁盘存储引擎(diskStorage)
// 磁盘存储引擎可以让你控制文件的存储。
const storage = multer.diskStorage({
// destination 是用来确定上传的文件应该存储在哪个文件夹中。
// 如果没有设置 destination,则使用操作系统默认的临时文件夹。
destination: function(req, file, cb){
cb(null, uploadPath)
},
// filename 用于确定文件夹中的文件名的确定。
// 如果没有设置 filename,每个文件将设置为一个随机文件名,并且是没有扩展名的。
filename: function(req, file, cb){
cb(null, file.fieldname + "-" + Date.now() + path.extname(file.originalname));
}
})
// Multer 接受一个 options 对象,其中最基本的是 dest 属性,这将告诉 Multer 将上传文件保存在哪。
// 如果你省略 options 对象,这些文件将保存在内存中,永远不会写入磁盘。
const upload = multer({storage: storage});
// .single(fieldname)
// 接受一个以 fieldname 命名的文件。这个文件的信息保存在 req.file。
app.post('/upload', upload.single('logo'), function(req, res, next){
res.send("文件上传成功!");
});
app.get('/uploadfile', function(req, res, next){
var form = fs.readFileSync('./views/upload.html', {encoding: 'utf8'});
res.send(form);
});
app.listen(port, () => {
console.log("server is run at port " + port);
})
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="/upload" method="POST" enctype="multipart/form-data">
<input type="file" name="logo" id="logo">
<input type="submit" value="上传">
</form>
</body>
</html>
启动服务,在浏览器地址栏输入:
http://localhost:3000/uploadfile
选择文件,点击上传,上传成功
到项目目录中查看,可以看到上传的文件
MVC简介
MVC是model、view、controller的简称。它是一种软件的设计思想,将应用的一个输入、处理、输出按照模型层,视图层,控制层进行分层设计。
- 模型: 业务逻辑包含了业务数据的加工与处理以及相应的基础服务(为了保证业务逻辑能够正常进行的事务、安全、权限、日志等等的功能模块)
- 视图:展现模型处理的结果;另外,还要提供相应的操作界面,方便用户使用。
- 控制器:视图发请求给控制器,由控制器来选择相应的模型来处理;模型返回的结果给控制器,由控制器选择合适的视图。