learn-vue [SM2(加-解密|加、验签)、SM4(加-解密)、Base64(加-解密)、MD5加密、RSA加/解密、加/解签]
vue [SM2(加-解密|加、验签)、SM4(加-解密)、Base64(加-解密)、MD5加密、RSA加/解密、加/解签]
·
1.SM2
1、项目根目录安装:SM2组件
npm install --save sm-crypto
2、加、解密
// 获取SM2对象
const sm2 = require('sm-crypto').sm2;
const cipherMode = 1 // 1 - C1C3C2,0 - C1C2C3,默认为1
// 公钥
var publicKeyServer = 'xxxxxxxxxxx';
// 私钥
var privateKeyWeb = 'xxxxxxxx';
//此处若把加密串a给服务端则加上 04+a
var a=sm2.doEncrypt('SM2加解密注意事项', publicKeyServer, 1)
console.log("SM2加密内容:"+a);
//如果自己前端解密后端返回的带有04开头的字符串则去掉04后解密
var b=sm2.doDecrypt(a,privateKeyWeb,1) // 解密结果
console.log("sm2解密内容:"+b);
3、 加、解签
后端是java 用的依赖如下:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.65</version>
</dependency>
目前的java的版本基本基于BC库的,新版的1.66BC库已经可以和其他语言互通了,
它默认的返回是 {der: true, hash: true} 这种的,验的时候带上这个参数就可以了
签名:sm2.doSignature(msg, privateKey, { hash:true, der:true }))
验签:sm2.doVerifySignature(msg, vSign, publicKey, { hash:true, der:true })
4、加、解签,实列:
const sm2 = require('sm-crypto').sm2;
// 参与加签的密文
const msg = '48656c6c6f20576f726c6420313432383537'
// 公钥
const publicKey ='04D3FD56FFAC7AFA6A39FF40A73BA2921F7AB723A59AA03B0914E893A544A69F4DCF8BB034BE4DF5072206FB01469F0F7F267A6B64CB5AA57BC564E18EA2EEDD1D'
// 加签后的签文
const vSign = '3045022100fb69fecb149ce9ae9115eb979803139cc9558c0e7bf512f994a1a16ddc8a2d6302205d40dc89e093e73a450160a44e25b1776fcc428f497500d59e476f5e46820ca2'
// 验签
const ver2 = sm2.doVerifySignature(msg, vSign, publicKey, { hash:true, der:true });
console.log(ver2);
2.SM4
1、 项目根目录安装:Sm4 组件
npm install gm-crypt
2、 加、解密
// 获取SM4对象
const SM4 = require("gm-crypt").sm4;
//配置sm4参数
let sm4Config = {
key: "gDg4g8CQyIrs^bv2", //这里这个key值是后端采用sm4加密的key
mode: "ecb", // 加密的方式有两种,ecb和cbc两种,
//也是看后端如何定义的,不过要是cbc的话下面还要加一个iv的参数,ecb不用
cipherType: "base64" // 后端选择Base64方式加密sm4加密结果至前端解密
};
// 初始化对象
let sm4 = new SM4(sm4Config);
3、加、解密操作,实例:
-- 加
let con = sm4.encrypt("Hello World 9999");
-- 解
let t =sm4.decrypt(con);
4、加、解密实例:
// sm4 加、解密
const SM4 = require("gm-crypt").sm4;
//配置sm4参数
let sm4Config = {
key: "SMF_KEY:14285789", //这里这个key值是跟后端要的
mode: "ecb",// 加密的方式有两种,ecb和cbc两种,也是看后端如何定义的,
//不过要是cbc的话下面还要加一个iv的
cipherType: "base64" // 后端选择Base64方式加密密文
};
let sm4 = new SM4(sm4Config);
let con = sm4.encrypt("Hello World 9999");
console.log("SM4-加密: "+con);
let t =sm4.decrypt(con);
console.log("SM4-解密: "+t)
5、概述
sm4加密有两种模式:ecb和cbc。两种模式的区别如下(下面文字来自百度):
一、优bai点不同:
ECB模式:1、简单;2、有利于并行计算;3、误差不会bai被传送;
CBC模式:1、不容易主动攻击,安全性好于baiECB,适合传输长度长的报文,是SSL、IPSec的标准。
二、缺点不同:
ECB模式:1、不能隐藏明文的模式;2、可能对明文进行主动攻击;
CBC模式:1、不利于并行计算;2、误差传递;3、需要初始化向量IV
三、概念不同
1、ECB模式又称电子密码本模式:Electronic codebook,是最简单的块密码加密模式,
加密前根据加密块大小(如AES为128位)分成若干块,
之后将每块使用相同的密钥单独加密,解密同理。
2、密码分组链接(CBC,Cipher-block chaining)模式,由IBM于1976年发明,
每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,
每个密文块都依赖于它前面的所有明文块。同时,为了保证每条消息的唯一性,
在第一个块中需要使用初始化向量IV。
3.Base64
1、在项目根目录下安装
npm install --save js-base64
2、在项目文件中引入
let base64 = require('js-base64').Base64
3、在项目文件中使用
let q = base64.encode("1234567890ASDFGH");
let u = base64.decode(q);
4、加、解密实列:
// Base64 加、解密
let base64 = require('js-base64').Base64
let q = base64.encode("1234567890ASDFGH");
console.log("Base64-加密-密文:"+q);
let u = base64.decode(q);
console.log("Base64-解密-明文:"+u);
4.md5
1、在项目根目录下安装
npm install --save js-md5
2、在main.js文件中,引入,并将md5挂在到vue原型上使其全局通用
import md5 from 'js-md5'
Vue.prototype.$md5 = md5
3、使用
let pwd = '1qaz@WSX#EDC';//假设为密码
let newpwd = this.$md5(pwd);//加密
console.log(newpwd)//查看加密后的密码
5.RSA 加/解密
安装
npm install jsencrypt --save-dev
npm install encryptlong -S
1、依赖引入 [main.js]
/* 引入jsencrypt实现数据RSA加密处理长文本数据时报错 jsencrypt.js Message too long for RSA */
import JSEncrypt from 'jsencrypt';
/* 引入encryptlong实现数据RSA加密encryptlong是基于jsenc rypt扩展的长文本分段加解密功能。 */
import Encrypt from 'encryptlong';
Vue.prototype.$jsEncrypt = JSEncrypt
2、使用位置
let publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCcBc+dUnGkfw6/DI46juK99HX6TzidbNnlqInhySf4jNz0HkaMGgO3l+/6IdGMH2X90px+qUhgQ8IF9a5B9mFM2jKMu6MBk9h0mQnUOnz4Iarh80r6Rnc33iK554Rjep0J7z/MBSWxnZY5PTh+xXE45XfBx7gK9XpZZUEd7R7fIwIDAQAB'
let privateKey = 'MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJwFz51ScaR/Dr8MjjqO4r30dfpPOJ1s2eWoieHJJ/iM3PQeRowaA7eX7/oh0YwfZf3SnH6pSGBDwgX1rkH2YUzaMoy7owGT2HSZCdQ6fPghquHzSvpGdzfeIrnnhGN6nQnvP8wFJbGdljk9OH7FcTjld8HHuAr1elllQR3tHt8jAgMBAAECgYA+a0i7LN+QKtDQeApyvPVTf3ivkoAY4xJtgbbf4KUgF+LRu0cIB+RSz/NPA7acs3cPS/IV7k2pTZJS5g44D4SvJXPIQiz89eukoH2O2blbK2J6wOCvQgqlT1ThDZjSRzmkzX21zy8wQZQp3igjUYYrSViTHtaY2RtzY75Ep3DosQJBAMpNYsONn9PGtT+e73rT1Zswq1F//DMV+sUrZKjMVKbf6KH0yHIYdULaID2LwF/uchDm5J34jVCxC/TP6rvXkOkCQQDFb6/4K0LtLrYt/uG/lx8Zx3lQ54f0Xt9TPD4wEIeqMbD/AD+unYDFvj3JOKzsJAKPmE8pmDQxUz4AJpmM6EgrAkEAxGv+yQBpfqYgtXUL8KZdcCEBNlCd/rwIkAhh48MBLkWZCicxuBYnRJGlXByk3IAYIHEO6JK8IuzEPx7hOyFCgQJBAJ9xA52ZajHagDsC09ICO5Z49Wq1n6BkIVu5kcsE/loeSP6Vd9gOz9hhOspOX69PoVXPPVas2LFgtPgwM96MEwMCQA0Iw2qOz11ta2cNhqb2EvX3xMuX19uZ26NmoSDhc0smXYXonEkq1nXOgr5k+p0G1Ud7tosFJmomc5cKWkpy8Pk='
// 加签名
let jse = new JSEncrypt();
// 公钥加签名
jse.setPublicKey(publicKey);
let mima = jse.encrypt('正在加密')
console.log('加密:'+mima)
// 私钥签名
jse.setPrivateKey(privateKey)
console.log('解密:'+jse.decrypt(mima))
更多推荐
已为社区贡献1条内容
所有评论(0)