フロントエンドとバックエンドの暗号化と復号化 [JS 暗号化モジュール (md5、crypto、crypto-js、jsencrypt) Python RSA 暗号化と復号化 (pycryptodome) モジュールのインストールと使用]

JS 暗号化モジュール [js-md5 (AES)、crypto (AES)、crypto-js()、jsencrypt (非対称暗号化、RSA)]

1. インストール

npm install js-md5
npm install crypto
npm install crypto-js
npm install jsencrypt

2. 使用する

1. js-md5
js-md5 は正確には暗号化ではありません。暗号文をシリアル化するものと言うべきです。次の Web サイトを通じて md5 暗号化文字を直接解析できるため、セキュリティは非常に低いです https:// www .cmd5
。 com/

const md5 = require('js-md5');
function md5Encryption(pwd){
    
    
  return md5(pwd) 
}
console.log(md5Encryption('abc123')); //e99a18c428cb38d5f260853678922e03

2.
暗号化にランダムキーを追加すると、MD5 に比べてセキュリティが大幅に向上し、上記の復号化 Web サイトからは復号化できなくなります。

'use strict'
const crypto  = require('crypto');
// 加密
function encryption(message){
    
    
  // 初始化数据
  const key = crypto.randomBytes(32) //32位随机共享密钥
  const iv = crypto.randomBytes(16); //初始向量,16字节
  const algorithm = 'aes-256-gcm'; //加密算法和操作模式
  const text = String(message); //将需要加密的数据转成字符串
  //初始化加密算法
  const cipher = crypto.createCipheriv(algorithm,key,iv); //传入创建密钥所需参数
  let encrypted = cipher.update(text,'utf8','hex'); // 初始化加密密文
  encrypted += cipher.final('hex') //加密密文
  const tag = cipher.getAuthTag() //生成标签,用于验证密文的来源
  return [encrypted,tag,key,iv,algorithm] //返回加密密文和密文来源信息
}
// 解密
function decrypt(cipherTextList){
    
    
  const [encrypted,tag,key,iv,algorithm] = cipherTextList //导入解密内容和解密需要用到的密钥
  const decipher = crypto.createDecipheriv(algorithm,key,iv)
  decipher.setAuthTag(tag) //传入验证标签,验证密文来源,当验证标签不一致时代码报错
  let decrypted = decipher.update(encrypted,'hex','utf8');
  decrypted += decipher.final('utf8')
  return decrypted
}

let ciphered = encryption(1234556344) //加密后返回密文数组
let cipher = decrypt(ciphered) //解密后返回解密密文
console.log(ciphered[0])  // 628e1b71ae1d27ef5e01
console.log(cipher); // 1234556344

3. Crypto-js は、
カスタマイズされたキーを使用して暗号化および復号するため、暗号文の暗号化および復号をより柔軟に行うことができますが、フロントエンドから暗号文のキーが見えるため、復号 Web サイトでは暗号化された情報を復号することはできません。フロントエンドで取得した公開キーを使用して復号化できます

// crypto-js加密
const CryptoJS  = require('crypto-js');
function cryptoEncryption(aseKey,message){
    
     //aseKey为密钥(必须为:8/16/32位),message为要加密的密文
  var encrypt = CryptoJS.AES.encrypt(message,CryptoJS.enc.Utf8.parse(aseKey),{
    
    
    mode:CryptoJS.mode.ECB,
    padding:CryptoJS.pad.Pkcs7
  }).toString();
  return encrypt
}
// crypto-js解密
function cryptoDecrypt(aseKey,message){
    
    
  var decrypt = CryptoJS.AES.decrypt(message, CryptoJS.enc.Utf8.parse(aseKey), {
    
    
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
  }).toString(CryptoJS.enc.Utf8);
  return decrypt
}

var aseKey = "12345678" //密钥一致才能进行解密     
var encrpytText = "abc12345";
var decryptText = 'KLqoT18E3l+OoDFLwS8DsA=='
console.log(cryptoEncryption(aseKey,encrpytText)); //调用加密方法
console.log(cryptoDecrypt(aseKey,decryptText));//调用解密方法

4. 非対称 (RSA) 暗号化: jsencrypt
非対称暗号鍵生成 Web サイト: http://web.chacuo.net/netrsakeypair
この暗号化モジュールについては、私が作成したバックエンド管理システムのプロジェクトに登場します。フロントエンドは vue です。ジャワです。アプリケーション シナリオでは、フロントエンドが公開キーを使用して暗号化する必要がある暗号文を暗号化し、バックエンドがフロントエンドによって暗号化された暗号文を秘密キーを使用して復号化する必要があります。これにより、前の 3 つと比較して暗号文のセキュリティが大幅に向上します。関連する使用方法については、フロントエンドに関する他の優れた暗号化および復号化に関する記事についての以下の2 番目の記事を参照してください。フロント
エンドに関する簡略化されたコードは参考のために以下に掲載されていますが、バックエンドに関する参考情報については、以下にリンクされている 2 番目のブログ投稿を参照してください。

let encryptor = new JSEncrypt() // 新建JSEncrypt对象
 
let publicKey = `公钥`  //设置公钥,可以从上面的非对称加密密钥生成网站中得到
 
encryptor.setPublicKey(publicKey) // 将得到的公钥通过setPbulicKey方法设置到JSEncrypt对象中
 
let rsaPassWord = encryptor.encrypt('加密密文') // 对需要加密的数据进行加密,rspPassWord就是加密密文

Python RSA暗号化と復号化

ファイル内の pub.key と pri.key は、Web サイトhttp://web.chacuo.net/netrsakeypairでローカルに生成され、ローカルに保存されます。

サードパーティのライブラリをインストールする

pip uninstall crypto pycryptodome  #安装的如果导入不成功卸载了
pip install pycryptodome     #再次安装

コード

import base64
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pksc1_v1_5
from Crypto.PublicKey import RSA
import os

dir_path = os.path.dirname(__file__)


def encrpt(msg):
    with open(dir_path+"\\pub.key", 'r', encoding='utf-8') as f:
        pub = f.read()  # 加密公钥
        public_key = '-----BEGIN PUBLIC KEY-----\n' + pub + '\n-----END PUBLIC KEY-----'
        rsakey = RSA.importKey(public_key)
        cipher = Cipher_pksc1_v1_5.new(rsakey)
        cipher_text = base64.b64encode(cipher.encrypt(msg.encode()))
        return cipher_text.decode()


def decrypt(encrypt_msg):
    with open(dir_path+"\\pri.key", 'r', encoding='utf-8') as f:
        pri = f.read()  # 加密私钥
        private_key = '-----BEGIN PRIVATE KEY-----\n' + \
            pri + '\n-----END PRIVATE KEY-----'
        decodeStr = base64.b64decode(encrypt_msg)  # cipher_text是上面rsa加密的内容
        rsakey = RSA.importKey(private_key)
        prikey = Cipher_pksc1_v1_5.new(rsakey)
        encry_text = prikey.decrypt(decodeStr, b'rsa')
        return encry_text.decode('utf8')

#前端经过加密的密文
ciphertext = "dOESS/7V8a1+RB5xweXnJCGr0SLQqf5H6tNQW/b78HDn9N6kEN2fzeEO4t3AqLkAlOzLXGtYKdONN8Hxs6lV7hPa2bHRJz5X4kzOqj/HsDqy9zd/1ZSoMxl7pi9B0dzhjThFqgydLSPvgAMyVQhvLjo/jOvtUJ6nPrd3pwmLCyJP9fP4vhC7KmJEJMzaOSbgQLFKksiR3Bv0O+mubcgTTSFKHMxgwcAQ+cPGtMNtnUMkCVruMZWUwQ23/0dm3KOWAALlumA59p+JMZNG4zThiXrIIkyGMZ62wmxfINEeTWBvI/7vq0kCOEPMf2RWpNnR+kxnZxKlp1ih7AIOvqAaLg=="

# ciphertext = encrpt('admin*cc123') #测试密钥
# print('密文:', ciphertext)

plaintext = decrypt(ciphertext)
print('明文:', plaintext)

フロントエンドでの暗号化と復号化に関するその他の優れた記事:

1. フロントエンドで CryptoJS を使用したいくつかの暗号化方法
https://www.jianshu.com/p/7b5eb33512fd
2. 非対称暗号化 (vue プロジェクト)
https://blog.csdn.net/weixin_42423019/article/details/82468626

おすすめ

転載: blog.csdn.net/weixin_51033461/article/details/121697575#comments_28488713