MD5盐值加密解密过程

木头的喵喵拖孩

MD5 盐值加密算法?是什么?

MD5 盐值加密,实际上应该叫 MD5 盐值摘要。
用户在前端登录时,一般会将密码使用 MD5 进行信息摘要,然后再将摘要结果传给后端存到数据库,这一步是为了防止密码被中间人抓包然后盗号。
但是目前看来,即使密码在传输过程中是摘要状态,也不是完全安全的。
因为不能保证用户会设置一些特别简单的密码,比如:123,321,12345,123abc,66666,8888 等,
这些密码因为过于简单,会被一些网站连同它们的摘要信息一起收录,生成对应表。

比如在这个网站 ,你输入摘要信息,是可以解密出简单的原始密码的,


一但中间人拿到了你密码的信息摘要,并通过这个网站 解密了你的密码,那么你依然会被盗号
所以问题的核心就出来了,密码过于简单
解决方法也出来了,让密码变得更加复杂


有聪明的程序员已经想好了办法,并且取名为MD5 盐值加密算法
就像撒盐一样,给密码调调味,其实就是将密码拼接一些字符串使其变得复杂,不容易被这种网站 解密。
具体怎么做:
在用户注册时,通过 MD5 盐值加密,将盐值和加密后的结果存到数据库。
在用户登录时,通过数据库的盐值和密码进行解密并匹配密码是否正确。

代码实现

这里模拟用户注册、用户登录情形,MD5方法来自https://www.npmjs.com/package/md5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>MD5盐值加密demo</title>
<style>
#conta {
display: flex;
justify-content: space-between;
}

#conta > * {
width: calc(50% - 4px);
}
</style>
</head>

<body>
<h3 style="text-align: center;">MD5盐值加密&解密过程模拟</h3>
<hr />
<div id="conta">
<div id="left">
<h4>模拟注册</h4>
<div>
<label for="username"></label>
<input
type="text"
id="username"
placeholder="请输入用户名"
/>
</div>
<div>
<label for="password"></label>
<input type="text" id="password" placeholder="请输入密码" />
</div>
<div>
<button id="register">注册</button>
</div>
<hr />
<h5>注册结果</h5>
<p>用户名:<span id="usernameRes"></span></p>
<p>盐值:<span id="salt"></span></p>
<p>密码最终加密结果:<span id="passwordRes"></span></p>
</div>
<div id="right">
<h4>模拟登录</h4>
<div>
<label for="username2"></label>
<input
type="text"
id="username2"
placeholder="请输入用户名"
/>
</div>
<div>
<label for="password"></label>
<input
type="password2"
id="password2"
placeholder="请输入密码"
/>
</div>
<div>
<button id="login">登录</button>
</div>
<hr />
<h5>登录结果</h5>
<p>用户名:<span id="username2Res"></span></p>
<p>MD5加密的密码:<span id="password2Res"></span></p>
<p>登录结果:<span id="loginRes"></span></p>
</div>
</div>
<script src="./node_modules/md5/dist/md5.min.js"></script>
<script>
const $ = (id) => document.getElementById(id);

const $usernameInput = $('username'),
$passwordInput = $('password'),
$registerBtn = $('register'),
$usernameRes = $('usernameRes'),
$passwordRes = $('passwordRes'),
$saltRes = $('salt'),
$username2Input = $('username2'),
$password2Input = $('password2'),
$loginBtn = $('login'),
$username2Res = $('username2Res'),
$password2Res = $('password2Res'),
$loginRes = $('loginRes');

// 模拟数据库用户表
const db = [];

const random = (min = 1, max = 10, decimal = 0) => {
return Math.round(Math.random() * (max - min) + min);
};

const getSalt = (saltLength = 20) => {
const saltSourceStr =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let salt = '';
for (let i = 0; i < saltLength; i++) {
salt +=
saltSourceStr[(0, random(saltSourceStr.length - 1))];
}
return salt;
};

// 核心代码,MD5盐值加密
const MD5SaltCrypto = (inputPwd) => {
const salt = getSalt();

// 第一次md5加密,加密原始密码,
// MD5方法来自https://www.npmjs.com/package/md5
let pwdMd5 = MD5(inputPwd);

// 第二次md5加密,需要把盐值和第一次md5加密后的结果拼接,然后将拼接结果再次md5加密
let pwdSaltMd5 = MD5(salt + pwdMd5);

return {
pwdSaltMd5,
salt
};
};

$registerBtn.onclick = () => {
let username = $usernameInput.value;
let { pwdSaltMd5, salt } = MD5SaltCrypto($passwordInput.value);
$usernameRes.innerText = username;
$passwordRes.innerText = pwdSaltMd5;
$saltRes.innerText = salt;
db.push({
username,
password: pwdSaltMd5,
salt
});
};

$loginBtn.onclick = () => {
let username = $username2Input.value;
let password = MD5($password2Input.value);

let find = db.find((user) => {
if (
user.username === username &&
user.password === MD5(user.salt + password)
)
return true;
return false;
});

if (find) $loginRes.innerText = '登录成功!';
else $loginRes.innerText = '登录失败!';
};
</script>
</body>
</html>
  • 标题: MD5盐值加密解密过程
  • 作者: 木头的喵喵拖孩
  • 创建于: 2023-07-19 14:32:28
  • 更新于: 2024-05-21 10:56:15
  • 链接: https://blog.xx-xx.top/2023/07/19/MD5盐值加密解密过程/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
此页目录
MD5盐值加密解密过程