zoukankan      html  css  js  c++  java
  • angular使用cryptojs在前端AES加密,java后端解密

    最近安全要求登录必须密文传参,于是决定找个前端插件来加密,就简单的用AES吧,虽说密码推荐的是非对称加密,但这只是个简单的内部小系统,安全也没要求那么严格。

    发现 cryptojs 使用比较方便,git地址:https://github.com/brix/crypto-js/tree/master,需要源码的的可以切换到 develop 版本下载。

    写本文时版本为:4.0.0

    话不多说,直接上代码了。

    前端加密:

    // 前端加密。
    import { AES, mode, pad, enc } from 'crypto-js';
    
    let Key = enc.Utf8.parse("MpWsyseHtJywNON8");// 秘钥长度需要是16的倍数,且需要进行Utf8转义。
    let aesUid: any = AES.encrypt("账号", Key, {
        mode: mode.ECB,
        padding: pad.Pkcs7
    }).ciphertext.toString(); // 注意此处 ciphertext 表示16进制
        
    let aesPwd: any = AES.encrypt("密码", Key, {
        mode: mode.ECB,
        padding: pad.Pkcs7
    }).ciphertext.toString();

    网上许多资料,包括官方git都没有说要 .ciphertext.toString(),导致开发中后端java始终无法正常解密,可能是新版本的缘故,个人实践发现需要用 .ciphertext.toString() 转换为16进制,后端才好解密。

    后端java解密:

       private static String html_aesKey = "MpWsyseHtJywNON8";
        
        /**
         * PKCS5Padding -- Pkcs7 两种padding方法都可以
         * @param content 3c2b1416d82883dfeaa6a9aa5ecb8245  16进制
         * @param key
         * @return
         */
        public static String decryptAES2(String content) {
            try {
                SecretKeySpec skeySpec = new SecretKeySpec(html_aesKey.getBytes("UTF-8"), "AES");
                Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); // "算法/模式/补码方式"
                cipher.init(Cipher.DECRYPT_MODE, skeySpec);
                return new String(cipher.doFinal(parseHexStr2Byte(content)));
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
     
        /**将16进制转换为二进制
         * @param hexStr
         * @return
         */
        public static byte[] parseHexStr2Byte(String hexStr) {
            if (hexStr.length() < 1)
                return null;
            byte[] result = new byte[hexStr.length()/2];
            for (int i = 0;i< hexStr.length()/2; i++) {
                int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
                int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
                result[i] = (byte) (high * 16 + low);
            }
            return result;
        }
  • 相关阅读:
    string类的方法
    引用
    面向对象之多态性(基类引用可以指向子类)
    SQL Server、Oracle数据库排序空值null问题解决办法(转)
    远程计算机已结束连接解决方法
    GUID自增ID表关联比较
    第四种行转列
    SQL简体转繁体互换(常用汉字词组)
    CSS基本布局16例
    Dojo Javascript 编程规范
  • 原文地址:https://www.cnblogs.com/jying/p/13810492.html
Copyright © 2011-2022 走看看