? ?國密算法,即國家商用密碼算法。是由國家密碼管理局認(rèn)定和公布的密碼算法標(biāo)準(zhǔn)及其應(yīng)用規(guī)范,其中部分密碼算法已經(jīng)成為國際標(biāo)準(zhǔn)。如SM系列密碼,SM代表商密,即商業(yè)密碼,是指用于商業(yè)的、不涉及國家秘密的密碼技術(shù)。
? ? ?不多廢話直接上干貨
?國密SM的安裝方法
項目中 可能存在版本問題 用這個降級安裝 (后面出現(xiàn)安裝問題同理)
npm install --save sm-crypto 或 npm install --save sm-crypto --legacy-peer-deps
1、SM2是非對稱加密算法
它是基于橢圓曲線密碼的公鑰密碼算法標(biāo)準(zhǔn),其秘鑰長度256bit,包含數(shù)字簽名、密鑰交換和公鑰加密,用于替換RSA/DH/ECDSA/ECDH等國際算法??梢詽M足電子認(rèn)證服務(wù)系統(tǒng)等應(yīng)用需求,由國家密碼管理局于2010年12月17號發(fā)布。
SM2采用的是ECC 256位的一種,其安全強度比RSA 2048位高,且運算速度快于RSA。
? ? SM2引入使用方法?
const sm2 = require('sm-crypto').sm2
const cipherMode = 1 // 1 - C1C3C2,0 - C1C2C3,默認(rèn)為1
****后端的話可以約定但后端默認(rèn)加密方法好像是0 - C1C2C3****
在解密時 使用的密鑰和密位一般是傳輸過來的,密文傳輸?shù)脕淼脑掗_頭會由04
需要刪除,同時密鑰可能存在必須小寫的情況 key.slice(2).toLocaleLowerCase() 可以使用這個方法
let encryptData = sm2.doEncrypt(msgString, publicKey, cipherMode) // 加密結(jié)果
let decryptData = sm2.doDecrypt(encryptData, privateKey, cipherMode) // 解密結(jié)果
下面的一般特殊情況才會用到
encryptData = sm2.doEncrypt(msgArray, publicKey, cipherMode) // 加密結(jié)果,輸入數(shù)組
decryptData = sm2.doDecrypt(encryptData, privateKey, cipherMode, {output: 'array'}) // 解密結(jié)果,輸出數(shù)組
2、SM3是一種密碼雜湊算法(用于數(shù)據(jù)摘要保證完整性)
? 用于替代MD5/SHA-1/SHA-2等國際算法,適用于數(shù)字簽名和驗證、消息認(rèn)證碼的生成與驗證以及隨機數(shù)的生成,可以滿足電子認(rèn)證服務(wù)系統(tǒng)等應(yīng)用需求,于2010年12月17日發(fā)布。
它是在SHA-256基礎(chǔ)上改進(jìn)實現(xiàn)的一種算法,采用Merkle-Damgard結(jié)構(gòu),消息分組長度為512bit,輸出的摘要值長度為256bit。
引入使用方法? ??
const sm3 = require('sm-crypto').sm3
?? ?this.loginForm = sm3(this.loginForm) //獲得摘要后的數(shù)據(jù)
3、SM4是分組加密算法(對稱性的加密方法)
? 跟SM1類似,是我國自主設(shè)計的分組對稱密碼算法,用于替代DES/AES等國際算法。SM4算法與AES算法具有相同的密鑰長度、分組長度,都是128bit。于2012年3月21日發(fā)布,適用于密碼應(yīng)用中使用分組密碼的需求。
加密
const sm4 = require('sm-crypto').sm4
const msg = '你好,我是空空.' // 可以為 utf8 串或字節(jié)數(shù)組
const key = 'facca330123456789abcdas3210' // 可以為 16 進(jìn)制串或字節(jié)數(shù)組,要求為 128 比特
前后端約定一種下面的加密方法
let encryptData = sm4.encrypt(msg, key) // 加密,默認(rèn)輸出 16 進(jìn)制字符串,默認(rèn)使用 pkcs#7 填充(傳 pkcs#5 也會走 pkcs#7 填充)?
let encryptData = sm4.encrypt(msg, key, {padding: 'none'}) // 加密,不使用 padding
let encryptData = sm4.encrypt(msg, key, {padding: 'none', output: 'array'}) // 加密,不使用 padding,輸出為字節(jié)數(shù)組
let encryptData = sm4.encrypt(msg, key, {mode: 'cbc', iv: 'fedcba98765432100123456789abcdef'}) // 加密,cbc 模式
解密
const sm4 = require('sm-crypto').sm4
const encryptData = '這里放加密后的數(shù)據(jù)' // 可以為 16 進(jìn)制串或字節(jié)數(shù)組
const key = 'abcdeffedcba98765432100123456789' // 可以為 16 進(jìn)制串或字節(jié)數(shù)組,要求為 128 比特
用約定的解密方法解密
let decryptData = sm4.decrypt(encryptData, key) // 解密,默認(rèn)輸出 utf8 字符串,默認(rèn)使用 pkcs#7 填充(傳 pkcs#5 也會走 pkcs#7 填充)
let decryptData = sm4.decrypt(encryptData, key, {padding: 'none'}) // 解密,不使用 padding
let decryptData = sm4.decrypt(encryptData, key, {padding: 'none', output: 'array'}) // 解密,不使用 padding,輸出為字節(jié)數(shù)組
let decryptData = sm4.decrypt(encryptData, key, {mode: 'cbc', iv: 'fedcba98765432100123456789abcdef'}) // 解密,cbc 模式
4.baser64
? 一般上述的那些會混合baser64使用 一塊提一嘴吧
? baser64安裝
npm install --save js-base64?
npm install --save js-base64 ?--legacy-peer-deps ?
引入方法?
在main.js中加入?
import {Base64} from 'js-base64'
Vue.prototype.$Base64 = Base64;
使用方法?
?let password='asdahsjdj'
?let encPass=this.$Base64.encode(password);//加密
?let decPass=this.$Base64.decode(encPass);//解密
當(dāng)初為了找到前端的使用方法,搜的腦子疼,為了配合后端加解密測試腦子更疼了,
使用方法的時候千萬要主要 前后端保持加解密密鑰格式方法的一致性文章來源:http://www.zghlxwxcb.cn/news/detail-407565.html
附上npm網(wǎng)址 :https://www.npmjs.com/package/sm-crypto?activeTab=explore文章來源地址http://www.zghlxwxcb.cn/news/detail-407565.html
到了這里,關(guān)于前端國密加解密使用方法SM2、SM3、SM4的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!