暗号化要件
- プロジェクト開発中、インターフェイス パラメーターの機密情報を暗号化して送信する必要があるため、バックエンド インターフェイスから返されるパラメーターも暗号化され、この時点で暗号化と復号化の操作が必要になります。
- この記事では、暗号化と復号化に AES を使用します。AES 暗号化アルゴリズムには、CBC、ECB、CTR、CFB、OFB の 5 つの異なる動作モードが用意されています。
- ここでは、CBC および ECB の暗号化と復号化についてのみ説明します。フロントエンドで使用される場合のこれら 2 つの暗号化モードの主な違いは次のとおりです。
- 基本的な暗号化方式で、暗号文を同じ長さ(十分ではない)のブロックに分割し、1つずつ暗号化し、1つずつ出力して暗号文を形成します。
- サイクリック モードでは、前のグループの暗号文と現在のグループの平文を XOR 演算または暗号化してから暗号化しますが、これは解読の難易度を高めることを目的としています。(積極的な攻撃が容易ではない、ECBよりも安全性が高い、SSLやIPSecの標準となっている)
AES暗号化と復号化
依存関係をインストールする
npm install crypto-js --save-dev
カプセル化暗号化・復号化方式(ECBモード)
- 次のメソッドをカプセル化し、ファイルに aes.js という名前を付けます。
import CryptoJS from 'crypto-js'
const AES_KEY = '****************'
export function encrypt ({
word }) {
const key = CryptoJS.enc.Utf8.parse(AES_KEY)
const srcs = CryptoJS.enc.Utf8.parse(word)
const encrypted = CryptoJS.AES.encrypt(srcs, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
})
return encrypted.toString()
}
export function decrypt ({
word }) {
var key = CryptoJS.enc.Utf8.parse(AES_KEY)
var decrypt = CryptoJS.AES.decrypt(word, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
})
return CryptoJS.enc.Utf8.stringify(decrypt).toString()
}
- 使用
import {
encrypt, decrypt } from './aes'
const encryptData = encrypt({
word: JSON.stringify(data) })
const decryptData = decrypt({
word: data})
カプセル化暗号化・復号化方式(CBCモード)
- 次のメソッドをカプセル化し、ファイルに aes.js という名前を付けます。
import CryptoJS from 'crypto-js'
const AES_KEY = '****************'
const IV = '****************'
export function encrypt( word ) {
let key = CryptoJS.enc.Utf8.parse(AES_KEY)
let iv = CryptoJS.enc.Utf8.parse(IV)
let srcs = CryptoJS.enc.Utf8.parse(word)
let encrypted = CryptoJS.AES.encrypt(srcs, key, {
iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.ZeroPadding
});
return encrypted.toString();
}
export function decrypt( word ) {
var key = CryptoJS.enc.Utf8.parse(AES_KEY)
let iv = CryptoJS.enc.Utf8.parse(IV)
var decrypt = CryptoJS.AES.decrypt(word, key, {
iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.ZeroPadding
})
return decrypt.toString(CryptoJS.enc.Utf8).trim()
}
- 使用
import {
encrypt, decrypt } from './aes'
const encryptData = encrypt(JSON.stringify(data))
const decryptData = decrypt(data)