后端实现sm3加密:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.54</version>
</dependency>
工具类
public class Sm3Utils {
private static final String ENCODING = "UTF-8";
static {
Security.addProvider(new BouncyCastleProvider());
}
/**
* sm3算法加密
*
* @param paramStr 待加密字符串
* @return 返回加密后,固定长度=32的16进制字符串
* @explain
*/
public static String encrypt(String paramStr) {
// 将返回的hash值转换成16进制字符串
String resultHexString = "";
try {
// 将字符串转换成byte数组
byte[] srcData = paramStr.getBytes(ENCODING);
// 调用hash()
byte[] resultHash = hash(srcData);
// 将返回的hash值转换成16进制字符串
resultHexString = ByteUtils.toHexString(resultHash);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return resultHexString;
}
/**
* 返回长度=32的byte数组
*
* @param srcData
* @return
* @explain 生成对应的hash值
*/
public static byte[] hash(byte[] srcData) {
SM3Digest digest = new SM3Digest();
digest.update(srcData, 0, srcData.length);
byte[] hash = new byte[digest.getDigestSize()];
digest.doFinal(hash, 0);
return hash;
}
/**
* 判断源数据与加密数据是否一致
*
* @param srcStr 原字符串
* @param sm3HexString 16进制字符串
* @return 校验结果
* @explain 通过验证原数组和生成的hash数组是否为同一数组,验证2者是否为同一数据
*/
public static boolean verify(String srcStr, String sm3HexString) {
boolean flag = false;
try {
byte[] srcData = srcStr.getBytes(ENCODING);
byte[] sm3Hash = ByteUtils.fromHexString(sm3HexString);
byte[] newHash = hash(srcData);
if (Arrays.equals(newHash, sm3Hash)) {
flag = true;
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return flag;
}
}
自测
public static void main(String[] args) {
String text="admin123";
String encr= Sm3Utils.encrypt(text);
System.out.println(encr);
boolean verify = Sm3Utils.verify(text,encr);
System.out.println(verify);
}
前端实现:
1.首先安装
npm install --save sm-crypto
2.实现方式:
// 加密方法
methods:{
doSM3() {
const sm3 = require('sm-crypto').sm3
this.loginForm.password = sm3(this.loginForm.passwords)
},
//点击登录
handleLogin(){
this.$refs.loginForm.validate((valid) => {
if (valid) {
doSM3()//调用加密方法
this.loginForm.password = doSM3(this.loginForm.passwords)
//调用接口部分,此处省略
} else {
return false
}
})
}