前后端使用AES算法加密密码

2 篇文章 0 订阅
1 篇文章 0 订阅

前后端使用AES算法加密传输数据

前后端常用的加密方式

  • 对称加密:指加密和解密使用相同密钥的加密算法,速度较快(包括DES算法,3DES算法,RC5算法,AES算法等);
  • 非对称对称加密:指加密和解密使用不同密钥的加密算法,速度较慢(包括RSA等);
  • 哈希算法:简单来说就是一种将数据通过算法变成不可逆的数据(包括:MD5、HMAC等);
  • 数字签名:是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。

AES(Advandced Encryption Standard)算法简介

  • 加密流程:如下图

    图片来源:https://blog.csdn.net/qq_28205153/article/details/55798628(侵删)

AES加密传输流程

  • 加密方式:ECB, CBC, CTR, CFB, OFB。
  • 填充模式:NoPadding, ZeroPadding,PKCS7,默认为PKCS7。

AES加密常用的两个模式是ECB和CBC模式。两者的区别:

  • CBC加密和解密都需要一个十六位的key(密钥)和一个十六位iv(偏移量)。
  • ECB加密不需要iv,只需要key(密钥)。

下面主要介绍 python+vue 使用AES算法的CBC模式来进行密码的加密传输。直接上代码。

前端:需要下载CryptoJS库 npm install -g crypto-js

<script>
    import CryptoJS from 'crypto-js'
    export default {
        methods: {
            aes_encrypt() {
                let raw_text = "加密前的明文数据"; //加密前明文
                let aes_key = "abcdefghijklmnop"; // 加密key
                let aes_iv = "0123456789101112";  // 偏移量
                // 加密-将秘钥和iv转换成Utf8字节数组
                let encrypted_text = CryptoJS.AES.encrypt(
                    raw_text, CryptoJS.enc.Utf8.parse(aes_key),
                    {
                        iv: CryptoJS.enc.Utf8.parse(aes_iv),
                        mode: CryptoJS.mode.CBC, // 加密模式:CBC
                        padding: CryptoJS.pad.Pkcs7 // 补全模式:pkcs7
                    }).toString();
                console.log("AES加密后的数据:", encrypted_text)
            },
            // 解密
            aes_decrypt(encrypted_text) {
                let aes_key = "abcdefghijklmnop";
                let aes_iv = "0123456789101112";
                var decrypted_text = CryptoJS.AES.decrypt(
                    encrypted_text, CryptoJS.enc.Utf8.parse(aes_key), {
                    iv: CryptoJS.enc.Utf8.parse(aes_iv),
                    mode: CryptoJS.mode.CBC,
                    padding: CryptoJS.pad.Pkcs7
                }).toString(CryptoJS.enc.Utf8);
                console.log("AES解密后的数据:", decrypted_text)
            }
        }
    }
</script>

后端:需要安装crypto库 pip3 install crypto

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
# 加密
def AES_Encrypt():
    # 1.初始化
    aes_key = b'abcdefghijklmnop' # 加密key
    aes_iv = b'0123456789101112' # 偏移量
    raw_text = "加密前的明文数据" # 加密前明文
    # CBC模式
    aes = AES.new(aes_key, AES.MODE_CBC, iv=aes_iv)
    # 2.转化成字节
    encode_bytes = raw_text.encode()
    # 3.补全字符 保证加密后的字节是16的倍数 默认为pkcs7模式
    padded_bytes = pad(encode_bytes, AES.block_size, style='pkcs7')
    # 4.aes加密
    encrypted_bytes = aes.encrypt(padded_bytes)
    # 5.使用Base64编码字节后decode解码成字符串 便于传输
    encrypted_text = base64.b64encode(encrypted_bytes).decode()
    return encrypted_text

# 解密
def AES_Decrypt(encrypted_text):
    # 1.初始化
    aes_key = b'abcdefghijklmnop'
    aes_iv = b'0123456789101112'
    aes = AES.new(aes_key, AES.MODE_CBC, iv=aes_iv)
    # 2.对字符串encode编码后使用base64解码成字节
    b64_decrypted_bytes = base64.b64decode(encrypted_text.encode())
    # 3.aes解密
    decrypted_bytes = aes.decrypt(b64_decrypted_bytes)
    # 4.去除填充
    unpad_bytes = unpad(decrypted_bytes, AES.block_size)
    # 5.转为字符串形式
    raw_text = str(unpad_bytes, errors="ignore")
    # raw_text = unpad_bytes.decode()
    return raw_text

当需要传输敏感数据时(例如登录密码),在前端使用aes_encrypt()方法对明文数据加密;后端收到字符串后使用AES_Decrypt()方法对字符串数据解密。前后端的加密密钥和偏移量要保持一致。

注意:

  1. 密钥必须为16字节的倍数的字节型数据。
  2. 明文必须为16字节的倍数的字节型数据,如果不足16字节,需要对其进行补全。补全模式默认为pkcs7需要前后端保持一致。
  3. 偏移量必须为16个字节型数据。
  4. AES的CBC模式虽然相对比EBC模式相对安全,但仍有密钥和偏移量暴露的风险,可以采用这种模式:每次传输内容前后端先把生成的16位随机偏移量发给前端。前端用此偏移量加密后再传输给后端。这样即使密钥暴露,但因为偏移量一直在改变,攻击者也不容易解密。此外还可以采用更为安全的RSA算法

参考链接:

  1. https://blog.csdn.net/devid008/article/details/129871875
  2. https://blog.csdn.net/eastWind1101/article/details/131092505
  3. https://blog.csdn.net/weixin_38819889/article/details/127620999
  4. https://blog.csdn.net/qq_28205153/article/details/55798628
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值