前后端 crypto-js aes 加解密

前后端 crypto-js aes 加解密


前言

项目中需要对敏感数据进行加密解密,比如身份证号,手机号码等关键信息,前后端都需要进行接口加密处理的情况,
此处使用的是crypto-js aes,有两种方式

安装包的使用案例

使用cdn资源


一、前端实现

1.安装包

(1)npm 安装

 
npm install crypto-js --save

(2) 引入

 
const CryptoJS = require('crypto-js'); 

(3)使用


function getAesString(data,key,iv){//加密
    var key  = CryptoJS.enc.Utf8.parse(key);
    var iv   = CryptoJS.enc.Utf8.parse(iv);
    var encrypted =CryptoJS.AES.encrypt(data,key,
        {
            iv:iv,
            mode:CryptoJS.mode.CBC,
            padding:CryptoJS.pad.Pkcs7
        });
    return encrypted.toString();    //返回的是base64格式的密文
}
function getDAesString(encrypted,key,iv){//解密
    var key  = CryptoJS.enc.Utf8.parse(key);
    var iv   = CryptoJS.enc.Utf8.parse(iv);
    var decrypted =CryptoJS.AES.decrypt(encrypted,key,
        {
            iv:iv,
            mode:CryptoJS.mode.CBC,
            padding:CryptoJS.pad.Pkcs7
        });
    return decrypted.toString(CryptoJS.enc.Utf8);     
}

function getAES(data){ //加密
    var key  = 'whsiwyw';  //密钥
    var iv   = '1234567812345678';
    var encrypted =getAesString(data,key,iv); //密文
    return encrypted;
}

function getDAes(data){//解密
    var key  = 'whsiwyw';  //密钥
    var iv   = '1234567812345678';
    var decryptedStr =getDAesString(data,key,iv);
    return decryptedStr;
}

//J1RQj2IOLeIVMpjZzYtkEg==

// var mypwd = getAES('liyanpeng123456')
// console.log(mypwd)
// alert(mypwd)

var resmypwd = getDAes('J1RQj2IOLeIVMpjZzYtkEg==')
console.log(resmypwd)
alert(resmypwd)

2.cdn使用

(1)引入资源


<!-- 引入 CDN Crypto.js 开始 AES加密 注意引入顺序 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/core.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/enc-base64.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/md5.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/evpkdf.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/cipher-core.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/aes.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/pad-pkcs7.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/mode-ecb.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/enc-utf8.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/enc-hex.min.js"></script>
<!-- 引入 CDN Crypto.js 结束 -->

(2)使用


function getAesString(data,key,iv){//加密
    var key  = CryptoJS.enc.Utf8.parse(key);
    var iv   = CryptoJS.enc.Utf8.parse(iv);
    var encrypted =CryptoJS.AES.encrypt(data,key,
        {
            iv:iv,
            mode:CryptoJS.mode.CBC,
            padding:CryptoJS.pad.Pkcs7
        });
    return encrypted.toString();    //返回的是base64格式的密文
}
function getDAesString(encrypted,key,iv){//解密
    var key  = CryptoJS.enc.Utf8.parse(key);
    var iv   = CryptoJS.enc.Utf8.parse(iv);
    var decrypted =CryptoJS.AES.decrypt(encrypted,key,
        {
            iv:iv,
            mode:CryptoJS.mode.CBC,
            padding:CryptoJS.pad.Pkcs7
        });
    return decrypted.toString(CryptoJS.enc.Utf8);     
}

function getAES(data){ //加密
    var key  = 'whsiwyw';  //密钥
    var iv   = '1234567812345678';
    var encrypted =getAesString(data,key,iv); //密文
    return encrypted;
}

function getDAes(data){//解密
    var key  = 'whsiwyw';  //密钥
    var iv   = '1234567812345678';
    var decryptedStr =getDAesString(data,key,iv);
    return decryptedStr;
}

//J1RQj2IOLeIVMpjZzYtkEg==

// var mypwd = getAES('liyanpeng123456')
// console.log(mypwd)
// alert(mypwd)

var resmypwd = getDAes('J1RQj2IOLeIVMpjZzYtkEg==')
console.log(resmypwd)
alert(resmypwd)

二、后端实现


//密钥 (需要前端和后端保持一致)
private const val KEY = "········"
//算法
private const val ALGORITHMSTR = "········"

val log = LoggerFactory.getLogger(this.javaClass)
/**
 * aes解密
 *
 * @param encrypt 内容
 * @return
 * @throws Exception
 */
fun aesDecrypt(encrypt: String?): String? {
    return try {
        aesDecrypt(encrypt, KEY)
    } catch (e: Exception) {
        e.printStackTrace()
        ""
    }
}

/**
 * aes加密
 *
 * @param content
 * @return
 * @throws Exception
 */
fun aesEncrypt(content: String): String {
    return try {
        aesEncrypt(content, KEY)
    } catch (e: Exception) {
        e.printStackTrace()
        ""
    }
}

/**
 * 将byte[]转为各种进制的字符串
 *
 * @param bytes byte[]
 * @param radix 可以转换进制的范围,从Character.MIN_RADIX到Character.MAX_RADIX,超出范围后变为10进制
 * @return 转换后的字符串
 */
fun binary(bytes: ByteArray?, radix: Int): String {
    return BigInteger(1, bytes).toString(radix) // 这里的1代表正数
}

/**
 * base 64 encode
 *
 * @param bytes 待编码的byte[]
 * @return 编码后的base 64 code
 */
fun base64Encode(bytes: ByteArray?): String {
    return Base64.encodeBase64String(bytes)
}

/**
 * base 64 decode
 *
 * @param base64Code 待解码的base 64 code
 * @return 解码后的byte[]
 * @throws Exception
 */
@Throws(Exception::class)
fun base64Decode(base64Code: String?): ByteArray? {
    return if (StringUtils.isEmpty(base64Code)) null else BASE64Decoder().decodeBuffer(base64Code)
}

/**
 * AES加密
 *
 * @param content 待加密的内容
 * @param encryptKey 加密密钥
 * @return 加密后的byte[]
 * @throws Exception
 */
@Throws(Exception::class)
fun aesEncryptToBytes(content: String, encryptKey: String): ByteArray {
    val kgen = KeyGenerator.getInstance("AES")
    kgen.init(128)
    val cipher = Cipher.getInstance(ALGORITHMSTR)
    cipher.init(Cipher.ENCRYPT_MODE, SecretKeySpec(encryptKey.toByteArray(), "AES"))
    return cipher.doFinal(content.toByteArray(charset("utf-8")))
}

/**
 * AES加密为base 64 code
 *
 * @param content 待加密的内容
 * @param encryptKey 加密密钥
 * @return 加密后的base 64 code
 * @throws Exception
 */
@Throws(Exception::class)
fun aesEncrypt(content: String, encryptKey: String): String {
    return base64Encode(aesEncryptToBytes(content, encryptKey))
}

/**
 * AES解密
 *
 * @param encryptBytes 待解密的byte[]
 * @param decryptKey 解密密钥
 * @return 解密后的String
 * @throws Exception
 */
@Throws(Exception::class)
fun aesDecryptByBytes(encryptBytes: ByteArray?, decryptKey: String): String {
    val kgen = KeyGenerator.getInstance("AES")
    kgen.init(128)
    val cipher = Cipher.getInstance(ALGORITHMSTR)
    cipher.init(Cipher.DECRYPT_MODE, SecretKeySpec(decryptKey.toByteArray(), "AES"))
    val decryptBytes = cipher.doFinal(encryptBytes)
    return String(decryptBytes)
}

/**
 * 将base 64 code AES解密
 *
 * @param encryptStr 待解密的base 64 code
 * @param decryptKey 解密密钥
 * @return 解密后的string
 * @throws Exception
 */
@JvmStatic
fun aesDecrypt(encryptStr: String?, decryptKey: String): String? {
    return try {
        log.info("aesDecrypt", aesDecryptByBytes(base64Decode(encryptStr), decryptKey))
        if (StringUtils.isEmpty(encryptStr)) null else aesDecryptByBytes(base64Decode(encryptStr), decryptKey)
    } catch (e: Exception) {
        log.error("aesDecrypt is error ! '${e.message}'" )
        return ""
    }
}

/**
 * 测试
 */
@Throws(Exception::class)
@JvmStatic
fun main(args: Array<String>) {
    val content = ""
    println("加密前:$content")
    // System.out.println("加密密钥和解密密钥:" + KEY);
    val encrypt = aesEncrypt(content, "········")
    println("加密后:$encrypt")
    val decrypt = aesDecrypt("········", "········")
    println("解密后:$decrypt")
}



总结

前后端 crypto-js aes 加解密实现。

参考文章:https://www.jianshu.com/p/90540249747d;https://www.jianshu.com/p/a47477e8126a;https://www.cnblogs.com/lz2017/p/8046816.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Crypto-js是一个JavaScript加密库,用于进行各种加密和解密操作。它提供了多种加密算法,包括对称加密和非对称加密,并支持各种常见的加密模式和填充方案。 使用Crypto-js进行加密非常简单。首先,我们需要引入Crypto-js库,可以通过在网页中引入相关的JavaScript文件或者使用npm安装来实现。然后,我们可以使用其提供的各种加密算法对需要加密的数据进行加密。例如,我们可以使用AES对称加密算法对数据进行加密。以下是一个使用Crypto-js进行AES加密的示例代码: ```javascript // 引入Crypto-js库 const CryptoJS = require("crypto-js"); // 定义需要加密的数据和秘钥 const data = "Hello, World!"; const key = "1234567890abcdef"; // 进行AES加密 const encryptedData = CryptoJS.AES.encrypt(data, key).toString(); console.log(encryptedData); ``` 解密也很简单,我们只需要使用相同的密钥对加密后的数据进行解密即可。以下是一个使用Crypto-js进行AES解密的示例代码: ```javascript // 引入Crypto-js库 const CryptoJS = require("crypto-js"); // 定义密文和秘钥 const encryptedData = "U2FsdGVkX19w3MLS2+2GLWsRy0iKIxqwnwll2YBKVIQ="; const key = "1234567890abcdef"; // 进行AES解密 const decryptedData = CryptoJS.AES.decrypt(encryptedData, key).toString(CryptoJS.enc.Utf8); console.log(decryptedData); ``` 通过以上示例,我们可以看到使用Crypto-js进行加密和解密非常简单。它提供了丰富的加密算法和功能,可以满足各种加密需求,是进行数据加密解密的常用工具库之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值