文章起源于稀土掘金技巧社区——大码猴
后端:密码得走密文哇!
我:base64?md5?
后端:这次不行哇,新来的测试不好糊弄呢!必须要国密sm2加密捏
我: 好吧,看我的。
我这边应用的是sm-crypto
,当然也有很多优良的库如:forge
,我在业务上搭配jszip做过上传zip文件内藏加密后的私钥进行证书登录,还是不错的支撑,但是文档社区不是很友爱,所以推举sm-crypto
,接下来让我们一起应用它吧。
sm-crypto
是一个基于Node.js的密码学库,专为与国密算法(中国密码算法尺度)兼容而设计。它供给了各种加密、解密、签名和验证功效。
sm-crypto
包括多种密码算法的实现,例如:
SM1:对称加密算法,其加密强度与AES相当,但该算法不公开,调用时须要通过加密芯片的接口进行调用。 SM2:非对称加密算法,基于ECC(椭圆曲线密码学)。该算法已公开,且由于基于ECC,其签名速度与秘钥生成速度都快于RSA。此外,ECC 256位(SM2采取的就是ECC 256位的一种)的安全强度比RSA 2048位高,但运算速度快于RSA。 SM3:资讯摘要算法,可以用MD5作为比较懂得,其校验成果为256位。 SM4:无线局域网尺度的分组数据算法,属于对称加密,密钥长度和分组长度均为128位。
sm-crypto内部办法介绍
1.SM2加密与解密
SM2是一种基于椭圆曲线密码学的非对称加密算法。sm-crypto供给了SM2的密钥生成、加密、解密等功效。通过调用相干办法,开发者可以轻松地生成SM2密钥对,并应用公钥进行加密、私钥进行解密。
const { sm2 } = require('sm-crypto');
const keyPair = sm2.generateKeyPairHex(); // 生成密钥对
const publicKey = keyPair.publicKey; // 公钥
const privateKey = keyPair.privateKey; // 私钥
const message = 'Hello, SM2!'; // 待加密的资讯
const encrypted = sm2.doEncrypt(message, publicKey, { hash: true }); // 应用公钥加密
const decrypted = sm2.doDecrypt(encrypted, privateKey, { hash: true, raw: true }); // 应用私钥解密
console.log('加密成果:', encrypted);
console.log('解密成果:', decrypted.toString()); // 输出原始资讯
2.SM3摘要算法
SM3是一种密码杂凑算法,用于生成资讯的摘要值。sm-crypto供给了SM3的摘要盘算功效,开发者可以通过调用相干办法盘算任意资讯的SM3摘要值。
const { sm3 } = require('sm-crypto');
const message = 'Hello, SM3!'; // 待盘算摘要的资讯
const digest = sm3(message); // 盘算SM3摘要值
console.log('SM3摘要值:', digest);
3.SM4分组加密算法
SM4是一种分组密码算法,实用于无线局域网等场景。sm-crypto供给了SM4的加密与解密功效,开发者可以应用SM4密钥对数据进行加密和解密操作。
const sm4 = require('sm-crypto').sm4; |
const sm4 = require('sm-crypto').sm4;
const key = '0123456789abcdeffedcba9876543210'; // 16字节的SM4密钥
const message = 'Hello, SM4!'; // 待加密的资讯
const encrypted = sm4.encrypt(Buffer.from(message), Buffer.from(key, 'hex')); // 加密
const decrypted = sm4.decrypt(encrypted, Buffer.from(key, 'hex')); // 解密
console.log('加密成果:', encrypted.toString('hex'));
console.log('解密成果:', decrypted.toString()); // 输出原始资讯
4、签名/验签
签名(Sign)
const { sm2 } = require('sm-crypto');
const keyPair = sm2.generateKeyPairHex(); // 生成密钥对
const publicKey = keyPair.publicKey; // 公钥
const privateKey = keyPair.privateKey; // 私钥
const message = '这是要签名的资讯'; // 调换为实际要签名的资讯
// 应用私钥对资讯进行签名
let sigValueHex = sm2.doSignature(message, privateKey);
console.log('签名成果:', sigValueHex);
验签(Verify Signature)
const message = '这是要验证签名的资讯'; // 应与签名时应用的资讯雷同
const sigValueHex = '签名值'; // 调换为实际的签名值字符串,即签名步骤中生成的sigValueHex
// 应用公钥验证签名是否有效
let verifyResult = sm2.doVerifySignature(message, sigValueHex, publicKey);
console.log('验签成果:', verifyResult); // 如果验证胜利,应输出true;否则输出false
实战例子
登录注册,对用户密码进行加密
注意:前端是不储存任何涉及安全的密钥(公钥是直接拿后端生成的)。
新建个工具文件,专门寄存加密逻辑,我这用的是SM2
// smCrypto.js
import { sm2 } from 'sm-crypto' // 引入加密库
export const doEncrypt = ( // 加密
data,
pKey = publicKey,
cipherMode = 0
) =>
sm2.doEncrypt(
typeof data === 'object'
? JSON.stringify(data) : data,
pKey,
cipherMode
)
export const encryptionPwd = async data => { // 加密密码高阶
let servePublicKey = ''
await user.getSm2Pkeys()
.then(res => {
servePublicKey = res.data.content
})
return doEncrypt(
data,
servePublicKey
)
}
sm-crypto
作为一款基于Node.js的国密算法库,为开发者供给了丰硕的密码学功效。通过调用sm-crypto的内部办法,开发者可以轻松地实现SM2加密与解密、SM3摘要盘算以及SM4分组加密等操作。这些功效在保障数据安全、构建安全运用等方面施展着主要作用。同时,开发者在应用sm-crypto时,也须要注意遵守最佳的安全实践,确保密钥的安全存储和管理,以防止潜在的安全风险。
因为微信大众,号修正规矩,如果不标星或点在看,你可能会收不到我大众,号文章的推送,请大家将本大众,号星标,看完文章后记得点下赞或者在看,谢谢各位!