Base64编码

特点:

  • 明文数据不会发生变化,加密结果也不会发生变化。
  • 可逆:明文数据通过编码变成不认识的加密字符,对应编码解码之后可以得到编码前的明文数据。
  • https://base64.us/
  • 浏览器中的base64编码:window.atob() 和 window.btoa()

代码示例:

// Buffer 是js内置对象
// 编码
// from 从
// 123456 明文数据
// utf-8 当前的编码格式
// toString('base64')  将utf-8格式数据转换为base64编码格式的字符串
const data = Buffer.from('123456', 'utf-8').toString('base64')
console.log(data)

// 解码  将base64格式数据转换为utf-8编码格式的字符串
const result = Buffer.from('MTIzNDU2', 'base64').toString('utf-8')
console.log(result)

MD5加密算法

特点:

  • 明文数据不会发生变化,加密的结果也不会发生变化;
  • 长度固定是32位,结果不可逆;
  • 常用使用场景:请求头参数,载荷参数,签名认证,服务器身份验证;

代码示例:

// nodejs内置模块,导入
const Crypto = require('crypto');

// 创建md5 hash对象
const obj = Crypto.createHash('md5')

// md5加密
obj.update('123456')

// 加密结果转为(固定为)字符串
// hex: 16进制
// digest:返回的结果长度固定为32位
let md5_str = obj.digest('hex')

console.log(md5_str)

链式结构书写方式:

const Crypto = require('crypto')

// 创建md5加密,update是加密的方式,加密为16进制格式
function create_md5(data) {
    return Crypto.createHash('md5').update(data).digest('hex')
}

对称加密算法

特点:

  • AES的密钥一般是16 24 32 个字节,偏移量是固定16个字节;
  • DES密钥和偏移量都是固定的8个字节;
  • 可逆;
  1. AES(Advanced Encryption Standard)加密:这是当前广泛使用的对称加密算法之一。AES 可以使用128位、192位或256位密钥,并且在安全性和性能方面都表现出色。它被广泛用于保护敏感数据,如银行交易、电子邮件传输等。
    注:128位密钥→10轮192位密钥 →12轮256位密钥→14轮
  2. DES(Data Encryption Standard)加密:DES 是最早的对称加密标准之一,使用56位密钥+8位校验。由于DES 的密钥长度较短,因此在安全性方面已经不再被认为是最佳选择,因此逐渐被 AES 所取代。
  3. DES(Triple DES):为了加强 DES 的安全性,3DES 使用了类似于三次的 DES 加密过程。它使用了两个密钥或者三个密钥,可以提供较高的安全性,但相对于AES 而言,性能较低。

固定加密和解密方法:

  1. 加密方法:encrypt()
  2. 解密方法:decrypt()

对称加密需要安装第三方包:

npm install crypto-js

AES加密 (更安全,常用)

  • AES加密密钥是字节,所以需要把字符串转为字节。
  • 网站中请求头参数,载荷参数都会加密。
  • 三大关联:密钥,偏移量,配置选项。
  • 明文数据不变,密文会发生变化(根据偏移量变化)。

示例代码:

const CryptoJS = require('crypto-js')

// 密钥的长度一般是 16 24 32 字节
let key = CryptoJS.enc.Utf8.parse('1234567890abcdef')

// 偏移量
const iv = CryptoJS.enc.Utf8.parse('1234567890abcdef')

// 配置选项
const config = {
    mode: CryptoJS.mode.CBC,      // 模式  CBC使用偏移量;ECB不使用偏移量
    padding: CryptoJS.pad.Pkcs7,  // 填充
    iv: iv                        // 偏移量
}

// AES加密
let result = CryptoJS.AES.encrypt('123456', key, config)
console.log(result.toString())

// AES解密
let result2 = CryptoJS.AES.decrypt(result, key, config)
console.log(result2.toString(CryptoJS.enc.Utf8))

DES加密

直接上代码:

const CryptoJS = require('crypto-js')

// 密钥 8个字节
const key = CryptoJS.enc.Utf8.parse('12345678')

// 偏移量
const iv = CryptoJS.enc.Utf8.parse('abcdefgh')

// 配置项
const config = {
    mode: CryptoJS.mode.CBC,     // 模式  CBC使用偏移量;ECB不使用偏移量
    padding:CryptoJS.pad.Pkcs7,  // 填充
    iv: iv                       // 偏移量
}

// DES加密
let result = CryptoJS.DES.encrypt('12345678', key, config)
console.log(result.toString())

// DES解密
let result2 = CryptoJS.DES.decrypt(result, key, config)
console.log(result2.toString(CryptoJS.enc.Utf8))

非对称加密算法

特点:

  • 明文数据不变,密文数据改变(即每次生成的密码不一样);
  • 需要公钥和私钥;
  • 公钥用来加密,私钥用来解密;
  • 公钥是对外公开的,外界通信很容易可以获取到,而私钥是不公开的;
  • rsa加密;
  • 生成公钥和私钥的网址:https://www.bchrt.com/tools/rsa/
  • 密文数据的长度根据公钥长度(512位 1024位 2048位 3072位 4096位)不同,密文长度不同;
  • 可逆;

固定加密和解密方法

  1. 加密方法:encrypt()
  2. 解密方法:decrypt()

非对称加密需要安装第三方模块:

npm install jsencrypt

示例代码:

// 导包
const JSEncrypt = require('jsencrypt')

// 实例化对象
const jse = new JSEncrypt()

// RSA加密
// 加密需要用公钥
const public_key =
    'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMdbt+VBSO7lWHvxmuQYvLM093EfxxUr\n' +
    'MilvJZjySQOkUenDm+mUfPePZHxBcL0ZJO6tq4KbUQzJQ+DI32mBeAMCAwEAAQ=='
// 设置公钥
jse.setPublicKey(public_key)
// 加密
let result = jse.encrypt('123456')
console.log(result)


// RSA 解密
// 解密需要私钥
const private_key =
    'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAx1u35UFI7uVYe/Ga\n' +
    '5Bi8szT3cR/HFSsyKW8lmPJJA6RR6cOb6ZR8949kfEFwvRkk7q2rgptRDMlD4Mjf\n' +
    'aYF4AwIDAQABAkBEdug50GjmulbgAgJqsWAkv1z3Oa2aRIJunmAwHY0btXjJeS5B\n' +
    'tH40m1kNOha6HUwFHlh5V4QqG+HPKv/AZX5BAiEA5OevcNLff407CNVXbxZ0HnGq\n' +
    'tl6N23LFWaZn3mbD4eMCIQDe9LP6vPSp9h++oq5n7QFh9IoN1n3jUmE66pRWONVr\n' +
    'YQIgaXXcvIxK8EcvNaik+cdMhGI2FoOFs98y0VT7cdnC0aUCIDNthHpozZLKyAXE\n' +
    'JrCoNbJvosyQVldyMCVT6MV+tJPhAiEA3/gB1ISfWqyYx9KILvc4RP5mCJWwR489\n' +
    'qca//QYlhp0='
// 设置私钥
jse.setPrivateKey(private_key)
// 解密
let result2 = jse.decrypt(result)
console.log(result2)

相关资料

python加密是js代码加密,因为是在浏览器中抓包,所以需要在python代码中执行js代码。

在python文件中运行js代码,需要安装第三方包:

pip install PyExecJs

在python文件中需要执行的js代码:

function func1(a, b) {
    return a + b
}

function func2(a, b) {
    return a - b
}

python代码,执行js:

import execjs

with open('./js函数.js', 'r', encoding="utf-8") as f:
    data = f.read()

# python不能直接执行就是代码,需要先编译
js_code = execjs.compile(data)

# 参数1是函数名,后面的是传入的参数,多个参数依次往后写
result = js_code.call('func1', 1, 2)
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐