前端AES加密

3 篇文章 0 订阅

AES是一种最常见的对称(加密和解密用相同的密钥)加密算法。crypto模块提供了AES支持,但是需要自己封装好函数,便于使用。

AES加密流程

AES加解密流程

  1. 明文:没有经过加密的数据。
  2. 密钥K:用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。
  3. AES加密函数:设AES加密函数为E,则 C = E(K, P),其中P为明文,K为密钥,C为密文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。
  4. 密文C:经加密函数处理后的数据
  5. AES解密函数:设AES解密函数为D,则 P = D(K, C),其中C为密文,K为密钥,P为明文。也就是说,把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P。
AES的基本结构

AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完所有组。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节。密钥的长度也支持128位、192位或256位。密钥的长度不同,推荐加密轮数也不同。如下表:
在这里插入图片描述
AES-128,也就是密钥的长度为128位,加密轮数为10轮。AES的加密公式为C = E(K,P),在加密函数E中,会执行一个轮函数,并且执行10次这个轮函数,这个轮函数的前9次执行的操作是一样的,只有第10次有所不同。也就是说,一个明文分组会被加密10轮。AES的核心就是实现一轮中的所有操作。

AES的处理单位是字节,128位的输入明文分组P和输入密钥K都被分成16个字节,分别记为P = P0 P1 … P15 和 K = K0 K1 … K15。如,明文分组为P = abcdefghijklmnop,其中的字符a对应P0,p对应P15。

AES程序代码

1、安装模块

npm install crypto-js

2、crypto.js

import CryptoJS from "crypto-js";

const key = CryptoJS.enc.Utf8.parse("1234567890abc765"); //16位
const iv = CryptoJS.enc.Utf8.parse("1234567890000000");

// AES加密
export function Encrypt(word,keyStr,ivStr){
    let key = KEY, iv = IV, srcs, encrypted;
    if (keyStr) {
		key = CryptoJS.enc.Utf8.parse(keyStr);
      	iv= CryptoJS.enc.Utf8..encrypt(ivStr);
	}
      srcs= CryptoJS.enc.Utf8.parse(word);
      encrypted= CryptoJS.AES.encrypt(srcs, key, {
        iv: iv,
        mode: CryptoJS.mode.EBC,
        padding: CryptoJS.pad.Pkcs7
      });
    return CryptoJS.enc.base64.stringify(encrypted.ciphertext); //返回base64格式密文
  },
  
  // AES解密
export function Decrypt(word,keyStr,ivStr){
	let key = KEY, iv = IV, base64, src, decrypt, decryptedStr;
    if (keyStr) {
		key = CryptoJS.enc.Utf8.parse(keyStr);
      	iv= CryptoJS.enc.Utf8..encrypt(ivStr);
	}
    base64 = CryptoJS.enc.Base64.parse(word);
    src = CryptoJS.enc.Base64.stringify(base64);
    decrypt = CryptoJS.AES.decrypt(srcs, key, {
      iv: iv,
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7
    });
    decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
    return decryptedStr.toString();
  }

key 是密钥 ,iv 是密钥偏移量,这个一般是接口返回的,或者前后端协定一致。值得注意的是密钥的长度,由于对称解密使用的算法是 AES-128-CBC算法,数据采用 PKCS#7 填充 , 因此这里的 key 需要为16位。

3、使用

import { Encrypt } from "crypto";
let newPassword = Encrypt(password);

注意到AES有很多不同的算法,如aes192,aes-128-ecb,aes-256-cbc等,AES除了密钥外还可以指定IV(Initial Vector),不同的系统只要IV不同,用相同的密钥加密相同的数据得到的加密结果也是不同的。
加密结果通常有两种表示方法:hex和base64,这些功能Nodejs全部都支持,但是在应用中要注意,如果加解密双方一方用Nodejs,另一方用Java、PHP等其它语言,需要仔细测试。如果无法正确解密,要确认双方是否遵循同样的AES算法,字符串密钥和IV是否相同,加密后的数据是否统一为hex或base64格式。

参考
AES加密算法的详细介绍与实现
廖雪峰的官方网站
AES加密算法

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端AES加密是一种常见的加密方式,可用于保护用户数据的安全性。然而,避免恶意第三方获取加密密钥是一项重要的任务。在前端开发中,隐藏加密密钥是非常有必要的,但是并不是一件容易的事情。下面是关于前端AES加密如何隐藏key的一些方法: 1.前端混淆 前端混淆是一种通过随机改变代码格式和命名规则来混淆、干扰黑客的翻译工作的技术。尽管前端混淆不能完全隐藏密钥,但它可以加强加密密钥的保密性。 2.后端加密加密密钥存储在后端服务器上,然后通过HTTPS协议将加密密钥传输到前端。这种方法保证了加密密钥的安全性,但服务器依然是一个数据的商家中心、是网络攻击的目标,如果服务器架构等漏洞被攻击或者IP被人肉搜索,就会导致服务器的信息泄漏甚至被入侵。 3.动态生成密钥 动态生成密钥是一种更加高级的加密技术方法,将AES密钥动态生成并且存储在变量中,该变量只在一次性使用身后立即销毁。加密操作采用动态密钥,用完即弃,这样可以避免密钥泄漏,保证数据的安全性。 推荐采用动态生成密钥的方法,既可以保证加密数据的安全,又可以有效的防止密钥泄露。密钥的安全性直接决定了加密数据的安全性,因此必须采用可靠的加密方法来密切保护密钥。同时,开发人员也应该深入学习加密技术知识,提高对前端AES加密的深入理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值