ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ(要知道对好事的称颂过于夸大,也会招来人们的反感轻蔑和嫉妒。——培根)
ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ
用户注册系统的前提是要拥有注册码,但注册码是一个绝对私密的文本,所以需要对存储结果和传输过程进行加密
需要下载npm jsencrypt
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<script src="node_modules/jsencrypt/bin/jsencrypt.js">script>
<script type="text/javascript">
// 后端返回值
const nodeRes = {
"code": 200,
"success": true,
"message": "ok!",
"data": {
"publicPem": "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDWXJ6QWw5MnNVWjJVZkdHTXN0QzVXeS9qTQpqWVNVc01zSEpnM3JuWFdDL0VQM0tvY0VRNGJEVGdaU2FHdHVzQzFWYjU3bVZmZWRtYUhGVTVKRHF6UEVVaEJTCk5YREt6VjFKMFpBNHdRWE1GcHlVVmxha0tnT3UwU3puc0VnUXkzWCtOSWplOEZlZWJZMU5QdzBMTml4STZYZ0cKTVBaaUttNElZcEZuWjQ5R0V3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ=="
}
};
// 用户输入的注册码明文
const registerCode = '216aa7a598a32248a63741651be5c9ee';
// base64解密
const publicPem = atob(nodeRes.data.publicPem);
console.log('解密后的公钥', publicPem);
// 实例化JSEncrypt对象
const encrypt = new JSEncrypt();
// 设置公钥
encrypt.setPublicKey(publicPem);
// 公钥加密注册码
const encCode = encrypt.encrypt(registerCode);
console.log('公钥加密后的注册码', encCode);
script>
head>
<body>
body>
html>
输出结果
解密后的公钥 -----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYrzAl92sUZ2UfGGMstC5Wy/jM
jYSUsMsHJg3rnXWC/EP3KocEQ4bDTgZSaGtusC1Vb57mVfedmaHFU5JDqzPEUhBS
NXDKzV1J0ZA4wQXMFpyUVlakKgOu0SznsEgQy3X+NIje8FeebY1NPw0LNixI6XgG
MPZiKm4IYpFnZ49GEwIDAQAB
-----END PUBLIC KEY-----
公钥加密后的注册码 Vd4e5n0GBZj/hLrg//WJ2z8nSoU9gfBiSJ7oJxeYH6pA7xDPtzDvkowtMzjIVV5uJ27QSA19TPlToK1NKlMBni9/6JPu9A+t8hjOUY8YfKknZ0bfenaqjcAPuSO8Ai60IW/CfzkLAn/FDYmAWvlfoxu1COuSlf7sAAXMO5ZTqnY=
注册码用使用md5加密,账户作为key,时间戳作为密钥进行加密存储
校验使用rsa公钥加密,私钥解密的方式
const cryptoJs = require('crypto-js');
const NodeRSA = require('node-rsa');
// 租户id
const accountID = '619b07312d6b99e1af7d8e4e';
// 注册码生成
const code = cryptoJs.HmacMD5(accountID, new Date().valueOf().toString()).toString();
console.log('生成的注册码', code);
// 生成公钥私钥
const key = new NodeRSA({ b: 1024 });
key.setOptions({ encryptionScheme: 'pkcs1' });//指定加密格式
// 生成 公钥私钥,使用 pkcs8标准,pem格式
var publicPem = key.exportKey('pkcs8-public-pem');//制定输出格式
var privatePem = key.exportKey('pkcs8-private-pem');
//console.log(key.$options);
console.log('公钥:\n', publicPem);
console.log('私钥:\n', privatePem);
// 前端公钥加密 前端可以使用jsencrypt加密
const publickKey = new NodeRSA(publicPem, { encryptionScheme: 'pkcs1' });
const encCode = publickKey.encrypt(code, 'base64');
console.log('公钥加密后', encCode);
// 服务端私钥解密
const privateKey = new NodeRSA(privatePem, { encryptionScheme: 'pkcs1' });
const decCode = privateKey.decrypt(encCode, 'utf8');
console.log('私钥解密后', decCode);
输出结果
生成的注册码 f1bff9f3303bb45a66b5855460c24605
公钥:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCEmKZY2LCkHETugknC4arNi4Dn
NCo/b+559qLTBd2dhcIs24PWrVC6SHSxm7zadTmg4HAJmPlzMIlyaeI+aEAl69so
hVex5pDG5d+TgDHvo5iFegneZ1EJmsUYkx9MO3ibC3QFtPVfFCWIYvNWRScqp+4/
pk+LrS5YT1eGE6tpXQIDAQAB
-----END PUBLIC KEY-----
私钥:
-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAISYpljYsKQcRO6C
ScLhqs2LgOc0Kj9v7nn2otMF3Z2Fwizbg9atULpIdLGbvNp1OaDgcAmY+XMwiXJp
4j5oQCXr2yiFV7HmkMbl35OAMe+jmIV6Cd5nUQmaxRiTH0w7eJsLdAW09V8UJYhi
81ZFJyqn7j+mT4utLlhPV4YTq2ldAgMBAAECgYBBe9n7Wtix07w/Rl0DP8vIwzKf
/GU4+yB9X06+hNET8HEbEjYkGWga95mZ9V3pTaduSilKtB/NwZS/yocPZxD2cmDR
yJb2LXw33Dwoe2p8vBeBcJL9K6CXKCXo83Y0XuBZKK41ZXuwzALEfeRlK87MDoZS
kAZ5N4E0pvBu7r+jwQJBAM02M2njv4OX9I4o/XrzswDCWSG/Z4jrV9zxj0/Skh3h
ji8QoPlfIHZ/lAkKiRQecHUliJnl1tdpZMWrWuVjDJUCQQClaa6fRG+jcoXeokjT
qJJKsNwYF/zZ9DfJVYtfLfnfqyPipExr2aW+INVC8urVugdOTmS1HXbnTzFjookv
Je+pAkB0R0UEuC8Zkq3ZK7LNy27ffEBjFgDFnYzwvdOVyFxRIDCfzI1aICPV4V5x
bQ3VX5YbWwQ3J/v/nVGji//6QJCtAkEAh7afqNizZ7zsjO9FJTNnY5Sb38C+mew/
YRaolNzZ6GM3vBnlAY++5rF1h8paViSdHeg/xEF6bumQshiGyYIskQJBAMKDC8/g
iTsCbXXvGzYIOaEpiJNBvNELXq0ihMt87oVAhwTn/27AWt4w0IVb+S6RlHWgin6W
Fp508vI/iJBD1pI=
-----END PRIVATE KEY-----
公钥加密后 Q2j2bzi636AGL0OeFfLkVtT7Xo73CfVTWqdNmRRLPz5061laE626DFawal6ppY/IeA7XDNL8H2DhM7YcOBiYPItbiJB0Gn0H6q9doddNm23QSSe/nNs33K/Q4s+Cop6VMhUChf2dfGZAFO0VXCP6yPi3O4efY5crEbEv8DuwUoA=
私钥解密后 f1bff9f3303bb45a66b5855460c24605