• Vue AES+MD5加密 后台解密


    前端VUE

    vue项目中安装crypto-js
    npm install crypto-js --save-dev
    

    CryptoJS (crypto.js) 为 JavaScript 提供了各种各样的加密算法。目前已支持的算法包括:

    • MD5
    • SHA-1
    • SHA-256
    • AES
    新建aes.js
    • srcutils目录下新建aes.js文件
    import Vue from 'vue'
    import CryptoJS from 'crypto-js'
    
    // AES-128-CBC偏移量
    const CBCIV = "abcdefgabcdefg12";
    
    export default {
        //加密
        encrypt(data){
            data = CryptoJS.MD5("copyright." + data + "pms@2016").toString();
            let key = CryptoJS.enc.Utf8.parse(CBCIV);
            let secretData = CryptoJS.enc.Utf8.parse(data);
            let encrypted = CryptoJS.AES.encrypt(
                secretData,
                key,
                {
                    iv: CryptoJS.enc.Utf8.parse(CBCIV),
                    mode:CryptoJS.mode.CBC,
                    padding: CryptoJS.pad.Pkcs7
                }
            );
            return encrypted.toString();
        },
    
        //解密
        decrypt(data){
            let key = CryptoJS.enc.Utf8.parse(CBCIV);
            let decrypt = CryptoJS.AES.decrypt(
                data,
                key,
                {
                    iv: CryptoJS.enc.Utf8.parse(CBCIV),
                    mode: CryptoJS.mode.CBC,
                    padding: CryptoJS.pad.Pkcs7
                });
            return CryptoJS.enc.Utf8.stringify(decrypt).toString();
        }
    }
    
    调用
    • 在需要使用加密的页面中引用aes.js
    import aes from "@/utils/aes";
    
    /**
     * 密码加密
     */
    test() {
      console.log("原密码:" + "P@ssw0rd");
      let encryptPassword = aes.encrypt('P@ssw0rd');
      console.log("加密后:" + encryptPassword);
      let decryptPassword = aes.decrypt(encryptPassword);
      console.log("解密后:" + decryptPassword);
    },
    

    在这里插入图片描述

    后台Spring Boot

    Aes.java
    import javax.crypto.Cipher;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import org.apache.commons.codec.binary.Base64;
    
    public class Aes {
        //密钥 (需要前端和后端保持一致)
        private static final String KEY = "abcdefgabcdefg12";  
    
        public static void main(String[] args) throws Exception {  
        	String encryptPassword = "CfMIyhzijEobTbtG9W24d55CwINGrmIj70WqrtPVKmwpgm63Ks7KoKUUuFN5uZch";
        	System.out.println("解密前:" + encryptPassword);  
        	String decryptPassword = Decrypt(encryptPassword, KEY);
        	System.out.println("解密后:" + decryptPassword);  
        } 
        
        /**
         * 加密    
         * @param sSrc
         * @param sKey
         * @return
         * @throws Exception
         */
        public static String Encrypt(String sSrc, String sKey) throws Exception {  
            if (sKey == null) {  
                System.out.print("Key为空null");  
                return null;  
            }  
            // 判断Key是否为16位  
            if (sKey.length() != 16) {  
                System.out.print("Key长度不是16位");
                return null;  
            }  
            byte[] raw = sKey.getBytes("utf-8");  
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");  
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/补码方式"  
            IvParameterSpec iv = new IvParameterSpec(sKey.getBytes());//使用CBC模式,需要一个向量iv,可增加加密算法的强度  
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);  
            byte[] encrypted = cipher.doFinal(sSrc.getBytes());  
            return new Base64().encodeToString(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。  
        }
        
        /**
        * 解密  
    	* @param sSrc
    	* @param sKey
    	* @return
    	* @throws Exception
    	*/
    	public static String Decrypt(String sSrc, String sKey) throws Exception {  
    	   try {  
    	       // 判断Key是否正确  
    	       if (sKey == null) {  
    	           System.out.print("Key为空null");  
    	           return null;  
    	       }  
    	       // 判断Key是否为16位  
    	       if (sKey.length() != 16) {  
    	           System.out.print("Key长度不是16位");  
    	           return null;  
    	       }  
    	       byte[] raw = sKey.getBytes("utf-8");  
    	       SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");  
    	       Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");  
    	       IvParameterSpec iv = new IvParameterSpec(sKey.getBytes());  
    	       cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);  
    	       byte[] encrypted1 = new Base64().decode(sSrc);//先用base64解密  
    	       try {  
    	           byte[] original = cipher.doFinal(encrypted1);  
    	           String originalString = new String(original,"utf-8");  
    	           return originalString;  
    	       } catch (Exception e) {  
    	           System.out.println(e.toString());  
    	           return null;  
    	       }  
    	   } catch (Exception ex) {  
    	       System.out.println(ex.toString());  
    	       return null;  
    	   }  
    	}
    
    }
    
    
    • 经常用到的加密场景大多就是登录密码加密了,在这里就不做具体的登录传输密码了,将前台MD5+AES加密后的密码拿来解密,模拟接收到登录密码后进行验证,从代码可以看出无论是前后台的解密都只是AES,在这里我们并不进行MD5解密,因为目前似乎还没有实现java解密MD5,数据库存储AES解密后的密码就可以了,运行main方法可以看到解密后的密码与前端解密一致,至此,将解密后的密码与数据库存储的AES解密后的密码拿来比对就行

    在这里插入图片描述

    end.

  • 相关阅读:
    oracle Constraint[相似 constraint使用方法总结 I]
    四个好看的CSS样式表格
    自己动手写操作系统--个人实践
    开机黑屏 仅仅显示鼠标 电脑黑屏 仅仅有鼠标 移动 [已成功解决]
    海量数据存储
    windows的定时任务设置
    人脸识别算法初次了解
    Java替代C语言的可能性
    二叉排序树
    海量数据处理面试题集锦
  • 原文地址:https://www.cnblogs.com/maggieq8324/p/12057013.html
Copyright © 2020-2023  润新知