Шифрование данных — это технология с долгой историей, которая относится к преобразованию открытого текста в зашифрованный текст с помощью алгоритма шифрования и ключа шифрования, а дешифрование — к восстановлению зашифрованного текста в открытый текст с помощью алгоритма дешифрования и ключа дешифрования. В основе лежит криптография.
Шифрование данных остается одним из самых надежных способов защиты информации в компьютерных системах. Он использует криптографическую технологию для шифрования информации, реализации сокрытия информации и, таким образом, играет роль в защите безопасности информации.
В этой статье Brother Abao расскажет, как выполнить гибридное шифрование данных, то есть использовать алгоритм симметричного шифрования и алгоритм асимметричного шифрования для шифрования данных, чтобы дополнительно обеспечить безопасность данных. Прочитав эту статью, вы будете знать следующее:
- Что такое симметричное шифрование, процесс симметричного шифрования, преимущества и недостатки симметричного шифрования и использование алгоритма симметричного шифрования AES;
- Что такое асимметричное шифрование, процесс асимметричного шифрования, преимущества и недостатки асимметричного шифрования и использование алгоритма асимметричного шифрования RSA;
- Что такое гибридное шифрование, процесс гибридного шифрования и как реализовать гибридное шифрование.
напоследокАпо есть что сказатьНа этом занятии брат Абао также кратко расскажет, что такое алгоритм дайджеста сообщения и что такое алгоритм MD5, его использование и недостатки.
Прочитайте последние популярные статьи брата А Бао (спасибо за вашу поддержку и поддержку 🌹🌹🌹):
- Воспроизвести внешний видеоплеер | Предупреждение о нескольких изображениях(659+ 👍)
- Играйте с интерфейсным двоичным кодом(349+ 👍)
- Как играть со словом документы на переднем конце(264+ 👍)
- Отличный учебник для начала работы с TypeScript(1377+ 👍)
- 10 лучших проектов TS, которые ослепляют ваши глаза(704+ 👍)
- Одна статья для понимания дженериков и приложений TypeScript (7,8 тыс. слов)(592+ 👍)
Хорошо, теперь приступим к делу. Чтобы друзья, которые плохо знакомы с гибридным шифрованием, лучше поняли и освоили гибридное шифрование, брат А Бао возьмет на себя"Машина времени"Приглашаем всех на релизную ночь...
В ту ночь наши товарищи по команде ждали обновления данных сервера, чтобы дать всем"забывать"Во время этого длительного процесса обновления брат А. Бао немедленно организовал сеанс обмена технологиями по гибридному шифрованию. в Апого«Принуждение»Ниже вскоре прибыли друзья команды, а затем брат А Бао начал сеанс обмена следующим диалогом:
Через несколько минут младший брат закончил говорить, и ему были даны ответы на основные ключевые моменты, но часть содержания была упущена. Чтобы друзья лучше понимали симметричное шифрование, брат Абао реорганизовал содержание, выраженное младшим братом.Давайте вместе рассмотрим симметричное шифрование.
1. Симметричное шифрование
1.1 Что такое симметричное шифрование
Алгоритм с симметричным ключом (английский: Алгоритм с симметричным ключом), также известный как симметричное шифрование, шифрование с закрытым ключом, шифрование с общим ключом, представляет собой тип алгоритма шифрования в криптографии.Такие алгоритмы используют один и тот же ключ для шифрования и дешифрования или используют два ключа, которые можно легко вычислить друг из друга.
1.2 Преимущества симметричного шифрования
Алгоритм открытый, сумма вычислений небольшая, скорость шифрования высокая, а эффективность шифрования высокая, что подходит для сцены шифрования большого объема данных.Например, в распространенных сценариях шифрования HLS (HTTP Live Streaming) алгоритм симметричного шифрования AES-128 обычно используется для шифрования фрагментов TS для обеспечения безопасности мультимедийных ресурсов.
1.3 Процесс симметричного шифрования
Отправитель использует ключ для шифрования данных открытого текста в зашифрованный текст, а затем отправляет его.После того как получатель получает зашифрованный текст, он использует тот же ключ для расшифровки зашифрованного текста в открытый текст для чтения.
1.4 Примеры использования симметричного шифрования
Распространенными алгоритмами симметричного шифрования являются AES, ChaCha20, 3DES, Salsa20, DES, Blowfish, IDEA, RC5, RC6, Camellia. Здесь мы берем общий алгоритм AES в качестве примера, чтобы представить процесс симметричного шифрования и дешифрования AES (Advanced Encryption Standard).
Затем Brother Abao будет использовать библиотеку crypto-js, чтобы представить шифрование и дешифрование алгоритма AES.CryptoJS.AES.encrypt()Этот метод используется для реализации шифрования AES, а соответствующий метод для дешифрования AES —CryptoJS.AES.decrypt().
Основываясь на двух вышеупомянутых методах, Baoge дополнительно инкапсулировалaesEncrypt()а такжеaesDecrypt()Эти два метода, которые используются для шифрования и дешифрования AES соответственно, реализуются следующим образом:
1.4.1 Метод шифрования AES
// AES加密
function aesEncrypt(content) {
let text = CryptoJS.enc.Utf8.parse(JSON.stringify(content));
let encrypted = CryptoJS.AES.encrypt(text, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
return encrypted.toString();
}
1.4.2 Метод расшифровки AES
// AES解密
function aesDecrypt(content) {
let decrypt = CryptoJS.AES.decrypt(content, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
return decrypt.toString(CryptoJS.enc.Utf8);
}
1.4.3 Пример шифрования и дешифрования AES
В приведенном выше примере мы создали 3 текстовые области на странице для хранения открытого текста, зашифрованного зашифрованного текста и расшифрованного открытого текста. когда пользователь нажимаетшифрованиеПри нажатии кнопки шифрование AES будет выполняться для открытого текста, введенного пользователем.После завершения шифрования зашифрованный текст будет отображаться в текстовой области, соответствующей зашифрованному тексту.Когда пользователь нажимаетрасшифроватьПри нажатии кнопки зашифрованный текст будет расшифрован AES.После завершения расшифровки расшифрованный открытый текст будет отображаться в соответствующей текстовой области.
Полный код, соответствующий приведенному выше примеру, выглядит следующим образом:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>AES 对称加密与解密示例</title>
<style>
.block {
flex: 1;
}
</style>
</head>
<body>
<h3>阿宝哥:AES 对称加密与解密示例(CBC 模式)</h3>
<div style="display: flex;">
<div class="block">
<p>①明文加密 => <button onclick="encrypt()">加密</button></p>
<textarea id="plaintext" rows="5" cols="15"></textarea>
</div>
<div class="block">
<p>②密文解密 => <button onclick="decrypt()">解密</button></p>
<textarea id="ciphertext" rows="5" cols="15"></textarea>
</div>
<div class="block">
<p>③解密后的明文</p>
<textarea id="decryptedCiphertext" rows="5" cols="15"></textarea>
</div>
</div>
<!-- 引入 CDN Crypto.js AES加密 -->
<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/core.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/enc-base64.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/cipher-core.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/aes.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/pad-pkcs7.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/enc-utf8.min.js"></script>
<!-- 引入 CDN Crypto.js 结束 -->
<script>
const key = CryptoJS.enc.Utf8.parse("0123456789abcdef"); // 密钥
const iv = CryptoJS.enc.Utf8.parse("abcdef0123456789"); // 初始向量
const plaintextEle = document.querySelector("#plaintext");
const ciphertextEle = document.querySelector("#ciphertext");
const decryptedCiphertextEle = document.querySelector(
"#decryptedCiphertext"
);
function encrypt() {
let plaintext = plaintextEle.value;
ciphertextEle.value = aesEncrypt(plaintext);
}
function decrypt() {
let ciphertext = ciphertextEle.value;
decryptedCiphertextEle.value = aesDecrypt(ciphertext).replace(/\"/g,'');
}
// AES加密
function aesEncrypt(content) {
let text = CryptoJS.enc.Utf8.parse(JSON.stringify(content));
let encrypted = CryptoJS.AES.encrypt(text, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
return encrypted.toString();
}
// AES解密
function aesDecrypt(content) {
let decrypt = CryptoJS.AES.decrypt(content, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
return decrypt.toString(CryptoJS.enc.Utf8);
}
</script>
</body>
</html>
В приведенном выше примере мы используем алгоритм симметричного шифрования AES для шифрования открытого текста «I am A Baoge» для обеспечения сокрытия информации.
Так может ли использование алгоритма симметричного шифрования решить нашу предыдущую проблему? Ответ — нет, потому что симметричное шифрование имеет некоторые недостатки.
1.5 Недостатки симметричного шифрования
Используя алгоритм симметричного шифрования, мы зашифровали открытый текст в зашифрованный текст. Хотя это решает проблему безопасности данных, это также порождает еще одну новую проблему. Поскольку алгоритм симметричного шифрования использует один и тот же ключ для шифрования и дешифрования, безопасность симметричного шифрования зависит не только от стойкости самого алгоритма шифрования, но и от того, надежно ли передается или хранится ключ.
Кроме того, для практических сценариев применения, чтобы избежать компрометации одного ключа, что приводит к компрометации всех зашифрованных данных, для разных данных мы обычно используем разные ключи для шифрования, что повышает безопасность, но также увеличивает сложность управления ключами.
Из-за вышеупомянутых проблем с симметричным шифрованием это не очень хорошее решение. Чтобы найти лучшее решение, брат А Бао начал новый раунд диалога.
2. Асимметричное шифрование
2.1 Что такое асимметричное шифрование
Алгоритмы асимметричного шифрования требуют двух ключей: открытого ключа (открытый ключ: сокращенно открытый ключ) и закрытого ключа (частный ключ: сокращенно закрытый ключ).Открытый ключ и закрытый ключ представляют собой пару. Если данные зашифрованы с помощью открытого ключа, их можно расшифровать только с помощью соответствующего закрытого ключа.Поскольку для шифрования и дешифрования используются два разных ключа, этот алгоритм называется алгоритмом асимметричного шифрования.
2.2 Преимущества асимметричного шифрования
Безопасность выше, открытый ключ является открытым, закрытый ключ хранится сам по себе, и нет необходимости предоставлять закрытый ключ другим.
2.3 Процесс асимметричного шифрования
2.4 Примеры использования асимметричного шифрования
Распространенными алгоритмами асимметричного шифрования являются RSA, Elgamal, алгоритм рюкзака, Rabin, D-H, ECC (алгоритм шифрования на основе эллиптических кривых). Здесь мы берем общий алгоритм RSA в качестве примера, чтобы представить процесс асимметричного шифрования и дешифрования RSA.
RSA был предложен в 1977 году Роном Ривестом, Ади Шамиром и Леонардом Адлеманом. Все трое в то время работали в Массачусетском технологическом институте. RSA — это сочетание первых букв их фамилий.
Далее Baoge будет использоватьjsencryptЭта библиотека для введения шифрования и дешифрования алгоритма RSA, библиотека предоставляетencrypt()Этот метод используется для реализации шифрования RSA, а соответствующий метод для расшифровки RSA —decrypt().
2.4.1 Создание открытых и закрытых ключей
использоватьjsencryptПеред этой библиотекой нам нужно сначала сгенерировать открытый и закрытый ключи. Затем брат Абао берет в качестве примера систему macOS, чтобы показать, как генерировать открытые и закрытые ключи.
Во-первых, давайте сгенерируем закрытый ключ, введя следующую команду в командной строке:
$ openssl genrsa -out rsa_1024_priv.pem 1024
После успешного выполнения команды в текущем каталоге будет создан файл.rsa_1024_priv.pemфайл со следующим содержимым:
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQDocWYwnJ4DYur0BjxFjJkLv4QRJpTJnwjiwxkuJZe1HTIIuLbu
/yHyHLhc2MAHKL0Ob+8tcKXKsL1oxs467+q0jA+glOUtBXFcUnutWBbnf9qIDkKP
...
bKkRJNJ2PpfWA45Vdq6u+izrn9e2TabKjWIfTfT/ZQ==
-----END RSA PRIVATE KEY-----
Затем сгенерируем публичный ключ, также в командной строке вводим следующую команду:
$ openssl rsa -pubout -in rsa_1024_priv.pem -out rsa_1024_pub.pem
После успешного выполнения команды в текущем каталоге будет создан файл.rsa_1024_pub.pemфайл со следующим содержимым:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDocWYwnJ4DYur0BjxFjJkLv4QR
JpTJnwjiwxkuJZe1HTIIuLbu/yHyHLhc2MAHKL0Ob+8tcKXKsL1oxs467+q0jA+g
lOUtBXFcUnutWBbnf9qIDkKP2uoDdZ//LUeW7jibVrVJbXU2hxB8bQpBkltZf/xs
cyhRIeiXxs13vlSHVwIDAQAB
-----END PUBLIC KEY-----
2.4.2 Создание шифратора и дешифратора RSA
После создания открытого и закрытого ключей мы можем дополнительно создать шифратор и дешифратор RSA, конкретный код выглядит следующим образом:
const PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDocWYwnJ4DYur0BjxFjJkLv4QR
...
cyhRIeiXxs13vlSHVwIDAQAB
-----END PUBLIC KEY-----`;
const PRIVATE_KEY = `-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQDocWYwnJ4DYur0BjxFjJkLv4QRJpTJnwjiwxkuJZe1HTIIuLbu
...
bKkRJNJ2PpfWA45Vdq6u+izrn9e2TabKjWIfTfT/ZQ==
-----END RSA PRIVATE KEY-----`;
const encryptor = new JSEncrypt(); // RSA加密器
encryptor.setPublicKey(PUBLIC_KEY);
const decryptor = new JSEncrypt(); // RSA解密器
decryptor.setPrivateKey(PRIVATE_KEY);
2.4.3 Пример шифрования и дешифрования RSA
В приведенном выше примере мы создали 3 текстовые области на странице для хранения открытого текста, зашифрованного зашифрованного текста и расшифрованного открытого текста. когда пользователь нажимаетшифрованиеПри нажатии кнопки шифрование RSA будет выполнено для открытого текста, введенного пользователем.После завершения шифрования зашифрованный текст будет отображаться в текстовой области, соответствующей зашифрованному тексту.Когда пользователь нажимаетрасшифроватьПри нажатии кнопки для зашифрованного текста будет выполняться расшифровка RSA.После завершения расшифровки расшифрованный открытый текст будет отображаться в соответствующей текстовой области.
Полный код, соответствующий приведенному выше примеру, выглядит следующим образом:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>RSA 非对称加密与解密示例</title>
<style>
.block {
flex: 1;
}
</style>
</head>
<body>
<h3>阿宝哥:RSA 非对称加密与解密示例</h3>
<div style="display: flex;">
<div class="block">
<p>①明文加密 => <button onclick="encrypt()">加密</button></p>
<textarea id="plaintext" rows="5" cols="15"></textarea>
</div>
<div class="block">
<p>②密文解密 => <button onclick="decrypt()">解密</button></p>
<textarea id="ciphertext" rows="5" cols="15"></textarea>
</div>
<div class="block">
<p>③解密后的明文</p>
<textarea id="decryptedCiphertext" rows="5" cols="15"></textarea>
</div>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/jsencrypt/2.3.1/jsencrypt.min.js"></script>
<script>
const PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDocWYwnJ4DYur0BjxFjJkLv4QR
JpTJnwjiwxkuJZe1HTIIuLbu/yHyHLhc2MAHKL0Ob+8tcKXKsL1oxs467+q0jA+g
lOUtBXFcUnutWBbnf9qIDkKP2uoDdZ//LUeW7jibVrVJbXU2hxB8bQpBkltZf/xs
cyhRIeiXxs13vlSHVwIDAQAB
-----END PUBLIC KEY-----`;
const PRIVATE_KEY = `-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQDocWYwnJ4DYur0BjxFjJkLv4QRJpTJnwjiwxkuJZe1HTIIuLbu
/yHyHLhc2MAHKL0Ob+8tcKXKsL1oxs467+q0jA+glOUtBXFcUnutWBbnf9qIDkKP
2uoDdZ//LUeW7jibVrVJbXU2hxB8bQpBkltZf/xscyhRIeiXxs13vlSHVwIDAQAB
AoGAKOarYKpuc5IYXdArEuHmnFaa2pm7XK8LVTuXVrNuuoPkpfw61Fs4ke3T0yKg
x6G3gq7Xm1tTEROAgMtaxqwo1D5n1H0nkyDFggLB0K9Ws0frp7HENtSQwdNSry1A
iD8TLxkhoWo7BS0VViLT1gKOfnw4YeMJP+CcOQ+DQjCsUMECQQD0Nc0vKBTlK6GT
28gcIMVoQy2KicjiH222A9/TLCNAQ9DEeZDYEptuTfrlbggfWdgQ3nc6CyvGf6c5
6uBPi/+5AkEA86oqqZPi7ekkUVHx0VSkp0mTlD1tAPhDE8cLX8vyImGExS+tTznz
ROyzm3T1M1PisdQIU8Wd5rqvHP6dB0enjwJAauhKpMQ1MYYCPApQ9g9anCQcgbOD
34nGq5HSoE2IOQ/3Cqv1PsIWjRlSJrIemCrqrafWJfDR/xnPCUnLXMd68QJAPNwG
1d4zMvslcA5ImOFMUuBEtST2geSAVINFqwK0krPKxrmWzxAJW/DHF5AJ4m0UVRhB
kDLusn90V4iczgGurwJAZUz6w01OeoLhsOuWNvkbTq+IV0NQ5GAEGA721Ck5zp86
bKkRJNJ2PpfWA45Vdq6u+izrn9e2TabKjWIfTfT/ZQ==
-----END RSA PRIVATE KEY-----`;
const encryptor = new JSEncrypt(); // RSA加密器
encryptor.setPublicKey(PUBLIC_KEY);
const decryptor = new JSEncrypt(); // RSA解密器
decryptor.setPrivateKey(PRIVATE_KEY);
const plaintextEle = document.querySelector("#plaintext");
const ciphertextEle = document.querySelector("#ciphertext");
const decryptedCiphertextEle = document.querySelector(
"#decryptedCiphertext"
);
function encrypt() {
let plaintext = plaintextEle.value;
ciphertextEle.value = encryptor.encrypt(plaintext);
}
function decrypt() {
let ciphertext = ciphertextEle.value;
decryptedCiphertextEle.value = decryptor.decrypt(ciphertext);
}
</script>
</body>
</html>
В приведенном выше примере мы используем алгоритм асимметричного шифрования RSA для шифрования открытого текста «I am A Baoge» для обеспечения сокрытия информации.
Так может ли использование алгоритмов асимметричного шифрования решить наши предыдущие проблемы? Ответ — нет, поскольку асимметричное шифрование также имеет некоторые недостатки.
2.5 Недостатки асимметричного шифрования
Асимметричное алгоритм алгоритма шифрования и расхождение затраты на длину, медленная скорость, подходит только для шифрования небольших данных. Поскольку мы должны предоставить общее решение, это не является хорошим решением небольшого количества данных и много данных одновременно. Чтобы решить проблему, abboyo Re-открыл новый раунд диалога.
3. Гибридное шифрование
3.1 Что такое гибридное шифрование
Гибридное шифрование представляет собой комбинациюСимметричное шифрованиеа такжеАсимметричное шифрованиеМетод шифрования со своими преимуществами. Его конкретная идея реализации состоит в том, чтобы сначала использоватьАлгоритм симметричного шифрованияЗашифруйте данные, а затем используйте алгоритм асимметричного шифрования дляСимметричный ключ шифрованияВыполните асимметричное шифрование, а затем отправьте получателю зашифрованный ключ и зашифрованные данные.
Чтобы дать друзьям возможность более интуитивно понять описанный выше процесс, брат Абао немного подумал и нарисовал рисунок, иллюстрирующий процесс смешанного шифрования.Давайте вместе посмотрим на рисунок.
3.2 Процесс гибридного шифрования
3.3 Реализация гибридного шифрования
Поняв «Процесс передачи данных с гибридным шифрованием», брат Абао и его друзья реализуют вышеупомянутый процесс гибридного шифрования. Здесь мы будем развиваться на основе представленных ранее примеров симметричного шифрования и асимметричного шифрования, то есть в следующих примерах будут напрямую использоваться открытый и закрытый ключи, использованные в предыдущих примерах асимметричного шифрования.
3.3.1 Создание функции для генерации случайного ключа AES
function getRandomAESKey() {
return (
Math.random().toString(36).substring(2, 10) +
Math.random().toString(36).substring(2, 10)
);
}
3.3.2 Создание функций шифрования и дешифрования AES
// AES加密
function aesEncrypt(key, iv, content) {
let text = CryptoJS.enc.Utf8.parse(JSON.stringify(content));
let encrypted = CryptoJS.AES.encrypt(text, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
return encrypted.toString();
}
// AES解密
function aesDecrypt(key, iv, content) {
let decrypt = CryptoJS.AES.decrypt(content, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
return decrypt.toString(CryptoJS.enc.Utf8);
}
3.3.3 Создание шифратора и дешифратора RSA
const PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDocWYwnJ4DYur0BjxFjJkLv4QR
...
cyhRIeiXxs13vlSHVwIDAQAB
-----END PUBLIC KEY-----`;
const PRIVATE_KEY = `-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQDocWYwnJ4DYur0BjxFjJkLv4QRJpTJnwjiwxkuJZe1HTIIuLbu
...
bKkRJNJ2PpfWA45Vdq6u+izrn9e2TabKjWIfTfT/ZQ==
-----END RSA PRIVATE KEY-----`;
const rsaEncryptor = new JSEncrypt(); // RSA加密器
rsaEncryptor.setPublicKey(PUBLIC_KEY);
const rsaDecryptor = new JSEncrypt(); // RSA解密器
rsaDecryptor.setPrivateKey(PRIVATE_KEY);
3.3.4 Создание гибридных функций шифрования и дешифрования
function hybirdEncrypt(data) {
const iv = getRandomAESKey();
const key = getRandomAESKey();
const encryptedData = aesEncrypt(key, iv, data);
const encryptedIv = rsaEncryptor.encrypt(iv);
const encryptedKey = rsaEncryptor.encrypt(key);
return {
iv: encryptedIv,
key: encryptedKey,
data: encryptedData,
};
}
function hybirdDecrypt(encryptedResult) {
const iv = rsaDecryptor.decrypt(encryptedResult.iv);
const key = rsaDecryptor.decrypt(encryptedResult.key);
const data = encryptedResult.data;
return aesDecrypt(key, iv, data);
}
3.3.5 Пример гибридного шифрования и дешифрования
После выполнения вышеуказанных шагов мы в основном завершили функцию гибридного шифрования.Прежде чем рассматривать полный код, давайте посмотрим на фактический эффект запуска:
Примечание. Соответствующее текстовое поле под расшифровкой зашифрованного текста, помимо зашифрованных данных, также содержит iv и ключ в режиме AES CBC, зашифрованный с помощью RSA.
В приведенном выше примере мы создали 3 текстовые области на странице для хранения открытого текста, зашифрованных данных и расшифрованного открытого текста. когда пользователь нажимаетшифрованиеПри нажатии кнопки открытый текст, введенный пользователем, будет смешан и зашифрован.После завершения шифрования зашифрованные данные будут отображаться в текстовой области, соответствующей зашифрованному тексту.Когда пользователь нажимаетрасшифроватьПри нажатии кнопки зашифрованный текст будет смешано расшифрован, то есть сначала используйте закрытый ключ RSA для расшифровки ключа AES и iv, а затем используйте их для расшифровки AES зашифрованного AES зашифрованного текста.После завершения расшифровки расшифрованный открытый текст будет отображаться в соответствующем текстовом поле.
Полный код, соответствующий приведенному выше примеру, выглядит следующим образом:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>混合加密与解密示例</title>
<style>
.block {
flex: 1;
}
</style>
</head>
<body>
<h3>阿宝哥:混合加密与解密示例</h3>
<div style="display: flex;">
<div class="block">
<p>①明文加密 => <button onclick="encrypt()">加密</button></p>
<textarea id="plaintext" rows="5" cols="15"></textarea>
</div>
<div class="block">
<p>②密文解密 => <button onclick="decrypt()">解密</button></p>
<textarea id="ciphertext" rows="5" cols="15"></textarea>
</div>
<div class="block">
<p>③解密后的明文</p>
<textarea id="decryptedCiphertext" rows="5" cols="15"></textarea>
</div>
</div>
<!-- 引入 CDN Crypto.js AES加密 -->
<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/core.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/enc-base64.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/md5.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/evpkdf.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/cipher-core.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/aes.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/pad-pkcs7.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/enc-utf8.min.js"></script>
<!-- 引入 CDN Crypto.js 结束 -->
<script src="https://cdn.bootcdn.net/ajax/libs/jsencrypt/2.3.1/jsencrypt.min.js"></script>
<script>
const PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDocWYwnJ4DYur0BjxFjJkLv4QR
JpTJnwjiwxkuJZe1HTIIuLbu/yHyHLhc2MAHKL0Ob+8tcKXKsL1oxs467+q0jA+g
lOUtBXFcUnutWBbnf9qIDkKP2uoDdZ//LUeW7jibVrVJbXU2hxB8bQpBkltZf/xs
cyhRIeiXxs13vlSHVwIDAQAB
-----END PUBLIC KEY-----`;
const PRIVATE_KEY = `-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQDocWYwnJ4DYur0BjxFjJkLv4QRJpTJnwjiwxkuJZe1HTIIuLbu
/yHyHLhc2MAHKL0Ob+8tcKXKsL1oxs467+q0jA+glOUtBXFcUnutWBbnf9qIDkKP
2uoDdZ//LUeW7jibVrVJbXU2hxB8bQpBkltZf/xscyhRIeiXxs13vlSHVwIDAQAB
AoGAKOarYKpuc5IYXdArEuHmnFaa2pm7XK8LVTuXVrNuuoPkpfw61Fs4ke3T0yKg
x6G3gq7Xm1tTEROAgMtaxqwo1D5n1H0nkyDFggLB0K9Ws0frp7HENtSQwdNSry1A
iD8TLxkhoWo7BS0VViLT1gKOfnw4YeMJP+CcOQ+DQjCsUMECQQD0Nc0vKBTlK6GT
28gcIMVoQy2KicjiH222A9/TLCNAQ9DEeZDYEptuTfrlbggfWdgQ3nc6CyvGf6c5
6uBPi/+5AkEA86oqqZPi7ekkUVHx0VSkp0mTlD1tAPhDE8cLX8vyImGExS+tTznz
ROyzm3T1M1PisdQIU8Wd5rqvHP6dB0enjwJAauhKpMQ1MYYCPApQ9g9anCQcgbOD
34nGq5HSoE2IOQ/3Cqv1PsIWjRlSJrIemCrqrafWJfDR/xnPCUnLXMd68QJAPNwG
1d4zMvslcA5ImOFMUuBEtST2geSAVINFqwK0krPKxrmWzxAJW/DHF5AJ4m0UVRhB
kDLusn90V4iczgGurwJAZUz6w01OeoLhsOuWNvkbTq+IV0NQ5GAEGA721Ck5zp86
bKkRJNJ2PpfWA45Vdq6u+izrn9e2TabKjWIfTfT/ZQ==
-----END RSA PRIVATE KEY-----`;
const rsaEncryptor = new JSEncrypt(); // RSA加密器
rsaEncryptor.setPublicKey(PUBLIC_KEY);
const rsaDecryptor = new JSEncrypt(); // RSA解密器
rsaDecryptor.setPrivateKey(PRIVATE_KEY);
const plaintextEle = document.querySelector("#plaintext");
const ciphertextEle = document.querySelector("#ciphertext");
const decryptedCiphertextEle = document.querySelector(
"#decryptedCiphertext"
);
function getRandomAESKey() {
return (
Math.random().toString(36).substring(2, 10) +
Math.random().toString(36).substring(2, 10)
);
}
// AES加密
function aesEncrypt(key, iv, content) {
let text = CryptoJS.enc.Utf8.parse(JSON.stringify(content));
let encrypted = CryptoJS.AES.encrypt(text, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
return encrypted.toString();
}
// AES解密
function aesDecrypt(key, iv, content) {
let decrypt = CryptoJS.AES.decrypt(content, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
return decrypt.toString(CryptoJS.enc.Utf8);
}
function hybirdEncrypt(data) {
const iv = getRandomAESKey();
const key = getRandomAESKey();
const encryptedData = aesEncrypt(key, iv, data);
const encryptedIv = rsaEncryptor.encrypt(iv);
const encryptedKey = rsaEncryptor.encrypt(key);
return {
iv: encryptedIv,
key: encryptedKey,
data: encryptedData,
};
}
function hybirdDecrypt(encryptedResult) {
const iv = rsaDecryptor.decrypt(encryptedResult.iv);
const key = rsaDecryptor.decrypt(encryptedResult.key);
const data = encryptedResult.data;
return aesDecrypt(key, iv, data);
}
function encrypt() {
let plaintext = plaintextEle.value;
const encryptedResult = hybirdEncrypt(plaintext);
ciphertextEle.value = JSON.stringify(encryptedResult);
}
function decrypt() {
let ciphertext = ciphertextEle.value;
const encryptedResult = JSON.parse(ciphertext);
decryptedCiphertextEle.value = hybirdDecrypt(encryptedResult).replace(/\"/g,'');
}
</script>
</body>
</html>
3.4 Анализ гибридной схемы шифрования
Благодаря этому примеру я считаю, что у каждого есть определенное понимание гибридного шифрования. Однако в реальных веб-проектах мы обычно не расшифровываем данные на стороне клиента, а отправляем данные на сторону сервера, а затем сервер выполняет расшифровку и обработку данных.
Протокол HTTP знаком большинству веб-разработчиков. Протокол HTTP основан на запросах и ответах, как показано на следующем рисунке:
В сценариях с высокими требованиями к безопасности данных или при передаче конфиденциальных данных мы можем рассмотреть возможность использования предыдущей схемы гибридного шифрования для гибридного шифрования данных, отправляемых на сервер.Когда сервер получает соответствующие зашифрованные данные, используйте соответствующие зашифрованные данные.Алгоритм расшифровки расшифровывает зашифрованные данные для дальнейшей обработки данных.
Но что, если сервер также возвращает конфиденциальные данные? Здесь брат Абао представит схему, в которой нужно использовать только пару открытого и закрытого ключей. Конечно, этот план предназначен только для справки.Если у вас есть хороший план, пожалуйста, оставьте сообщение или свяжитесь с братом Абао.
Рассмотрим конкретный процесс работы программы:
① Создайте уникальный reqId (идентификатор запроса) для идентификации текущего запроса;
② Создайте случайный ключ AES и AES IV соответственно (используя режим AES CBC);
③ Используйте алгоритм асимметричного шифрования RSA для выполнения асимметричного шифрования RSA на ключе AES и AES IV соответственно;
④ Используйте случайно сгенерированный ключ AES и AES IV для выполнения симметричного шифрования AES для конфиденциальных данных;
⑤ Используйте reqId в качестве ключа и сохраните объект, состоящий из ключа AES и AES IV, в качестве значения в объекте Map или {};
⑥ Сохраните reqId, зашифрованный ключ AES, AES IV и зашифрованные данные в объект и отправьте его на сервер;
⑦ Когда сервер получает данные, он расшифровывает полученные данные, а затем использует расшифрованный ключ AES и AES IV, отправленные клиентом, для выполнения симметричного шифрования AES для данных ответа;
⑧ После завершения шифрования данных сервер упаковывает reqId и зашифрованные данные в объект ответа и возвращает его клиенту;
⑨ Когда клиент успешно получает ответ от сервера, он сначала получает reqId, а затем получает информацию о шифровании AES, соответствующую reqId, из карты, в которой хранятся ключ AES и IV;
⑩ Клиент использует зашифрованную информацию, соответствующую текущему reqId, для расшифровки данных, возвращаемых сервером.После завершения расшифровки существующая запись удаляется из карты или объекта {}.
Теперь давайте проведем простой анализ описанного выше процесса.Во-первых, зашифрованная AES информация генерируется случайным образом и сохраняется в памяти независимо в соответствии с каждым запросом.Когда ключ и IV в зашифрованной информации AES отправляются на сервер, алгоритм симметричного шифрования RSA для шифрования.
Когда сервер возвращает данные, он использует информацию о шифровании AES, соответствующую текущему запросу, для шифрования возвращаемого результата и возвращает reqId (идентификатор запроса), соответствующий текущему запросу. То есть серверу не нужно генерировать новую информацию о шифровании AES для шифрования данных ответа, поэтому нет необходимости передавать информацию о шифровании AES в объекте ответа.
Это решение кажется идеальным, так как наша зашифрованная информация все еще существует в памяти, если вы используете инструменты разработчика для отладки веб-приложения, вы все равно можете видеть зашифрованную информацию, соответствующую каждому запросу. Итак, как решить эту проблему? Можем ли мы предотвратить использование инструментов разработчика для отладки нашего веб-приложения, ответ — да.
Тем не менее, брат Абао не будет продолжать расширяться здесь.Я могу позже написать отдельную статью о том, как предотвратить использование инструментов разработчика для отладки веб-приложений.Заинтересованные друзья могут оставить мне сообщение.
4. Брату А Бао есть что сказать
4.1 Что такое алгоритм дайджеста сообщения
Фактически в повседневной работе помимо симметричного шифрования используются и алгоритмы асимметричного шифрования. Существует также широко используемый алгоритм дайджеста сообщений. Алгоритм дайджеста сообщения является очень важным разделом криптографии. Он извлекает информацию об отпечатках пальцев из всех данных для обеспечения подписи данных, проверки целостности данных и других функций. Из-за его необратимости он иногда используется для шифрования конфиденциальной информации. Алгоритм дайджеста сообщения также известен как алгоритм хеширования (Hash) или алгоритм хеширования.
После того, как любое сообщение будет обработано хэш-функцией, оно получит уникальное хеш-значение Этот процесс называется «дайджестом сообщения», а его хэш-значение называется «цифровой отпечаток пальца», а его алгоритм, естественно, «алгоритм дайджеста сообщения».Другими словами, если его цифровые отпечатки непротиворечивы, это означает, что его сообщения непротиворечивы.
(Источник изображения — https://en.wikipedia.org/wiki/hash_function)
Основная особенность алгоритма дайджеста сообщения заключается в том, что процесс шифрования не требует ключа, и зашифрованные данные не могут быть расшифрованы.В настоящее время только алгоритм CRC32 может быть расшифрован в обратном порядке.Тот же шифртекст можно получить только путем ввода одни и те же открытые текстовые данные с использованием одного и того же алгоритма дайджеста сообщения.Алгоритм дайджеста сообщения не имеет проблем с управлением и распространением ключей и подходит для использования в распределенных сетях. Алгоритм дайджеста сообщения в основном используется в области «цифровой подписи» в качестве алгоритма дайджеста для открытого текста. Хорошо известными алгоритмами дайджеста являются алгоритм RSA MD5 и алгоритм SHA-1, а также большое количество вариантов.
Алгоритм дайджеста сообщения имеет следующие характеристики:
- Независимо от длины входного сообщения, длина вычисляемого дайджеста сообщения всегда фиксирована.Например, сообщение, обработанное алгоритмом MD5, имеет 128 бит, а сообщение, обработанное алгоритмом SHA-1, имеет окончательный результат 160 бит. Вариант SHA-1 может дать 192 бита и 256 бит дайджеста сообщения. Обычно считается, что чем длиннее окончательный вывод дайджеста, тем надежнее алгоритм дайджеста.
- Дайджест сообщения выглядит «случайным».Эти биты кажутся случайным образом перемешанными друг с другом, и можно использовать большое количество входных данных, чтобы проверить, совпадают ли их выходные данные.Как правило, разные входные данные будут иметь разные выходные данные, и итоговое сообщение вывода может быть проверено на случайность.В общем, поскольку входные сообщения различны, обработанные сообщения, полученные после их обработки, также должны быть разными, но одни и те же входные данные должны давать одинаковые выходные данные.
- Функция дайджеста сообщения является односторонней функцией, то есть может быть выполнена только дайджест сообщения, но из дайджеста не может быть восстановлено ни одно сообщение, и даже вообще не может быть найдена информация, относящаяся к исходному сообщению.
- Хороший изящный алгоритм, где никто не сможет найти «столкновения» или чрезвычайно трудно найти, хотя «столкновения» определенно существуют (столкновениями являются разные контент, создающие ту же дайджест).
4.2 Что такое алгоритм MD5
MD5 (Message Digest Algorithm 5, версия алгоритма дайджеста сообщения 5), который разработан на основе MD2, MD3, MD4, был предложен Роном Ривестом (компания RSA) в 1992 году и в настоящее время широко используется для проверки целостности данных, данных (сообщений). дайджест, подпись данных и т. д.Все MD2, MD4 и MD5 генерируют 16-байтовые (128-битные) контрольные значения, которые обычно представляются 32-битными шестнадцатеричными числами. Алгоритм MD2 медленнее, но относительно безопасен, MD4 быстр, но менее безопасен, а MD5 более безопасен и быстрее, чем MD4.
С развитием компьютерных технологий и постоянным улучшением уровня вычислений в алгоритме MD5 появляется все больше и больше лазеек. После 1996 года было подтверждено, что слабые места есть и их можно взломать.Для данных, требующих высокой степени безопасности, эксперты вообще рекомендуют переходить на другие алгоритмы, например SHA-2.В 2004 году было подтверждено, что алгоритм MD5 не может предотвратить коллизии (столкновения), поэтому он неприменим. Он используется для проверки подлинности безопасности, такой как проверка подлинности с открытым ключом SSL или цифровая подпись.
4.2.1 Функции MD5
- Стабильно и быстро.
- Сжимаемость: входные данные любой длины, выходные данные фиксированной длины (128 бит).
- Операция необратима: если результат операции известен, исходная строка не может быть получена обратной операцией.
- Высокая дискретность: небольшие изменения на входе могут привести к огромным различиям в результатах операции.
4.2.2 Хэш MD5
128-битный хэш MD5 в большинстве случаев будет представлен как 32-битное шестнадцатеричное число. Ниже приведен хэш MD5 43-битного столбца, состоящего только из ASCII:
MD5("The quick brown fox jumps over the lazy dog")
= 9e107d9d372bb6826bd81d3542a419d6
Даже небольшое изменение в исходном тексте (например, замена собаки на шестеренку, изменение только одного символа) кардинально меняет хэш:
MD5("The quick brown fox jumps over the lazy cog")
= 1055d3e698d289f2af8663725127bd4b
Возьмем еще несколько примеров хеширования MD5:
MD5("") -> d41d8cd98f00b204e9800998ecf8427e
MD5("semlinker") -> 688881f1c8aa6ffd3fcec471e0391e4d
MD5("kakuqo") -> e18c3c4dd05aef020946e6afbf9e04ef
4.2.3 Назначение алгоритма MD5
Распространение файлов с защитой от несанкционированного доступа
При распространении установочного пакета программного обеспечения в Интернете, в целях безопасности, чтобы предотвратить подделку программного обеспечения, например, добавление троянской программы в программу установки программного обеспечения. Разработчики программного обеспечения часто используют алгоритмы дайджеста сообщения, такие как MD5, для создания цифрового отпечатка, соответствующего файлу, чтобы получатель мог использовать некоторые готовые инструменты для проверки целостности файла после его получения.
Передача сообщений с защитой от несанкционированного доступа
Предположим, вам нужно отправить электронный документ своим друзьям в Интернете.Перед отправкой файла выполните операцию MD5 над содержимым документа, чтобы получить «цифровой отпечаток» электронного документа, и добавьте «цифровой отпечаток» с электронный документ, отправленный другой стороне. Когда другая сторона получает электронный документ, она также использует алгоритм MD5 для хеширования содержимого документа. После завершения операции будет получен соответствующий «цифровой отпечаток пальца». Когда отпечаток пальца соответствует «цифровому отпечатку пальца», документа, который вы отправили, указывая на то, что документ не был изменен во время передачи.
4.2.4 Дефекты алгоритма MD5
Коллизия хэшей означает, что разные входные данные дают один и тот же результат.В хорошем алгоритме хеширования никто не должен быть в состоянии найти «коллизию» или чрезвычайно трудно найти, хотя «коллизия» определенно существует.
В 2005 г. профессор Ван Сяоюнь из Шаньдунского университета опубликовал алгоритм, с помощью которого можно легко создавать экземпляры коллизий MD5. С тех пор, в 2007 г., некоторые иностранные ученые предложили еще один алгоритм построения префиксных коллизий MD5 «коллизию выбранных префиксов» на основе алгоритма профессора Ван Сяоюня. Эксперты последовательно предоставили библиотеки с открытым исходным кодом для построения коллизий MD5.
В 2009 году Се Тао и Фэн Дэнго из Китайской академии наук преодолели устойчивость к коллизиям MD5 всего лишь со сложностью алгоритма коллизии 220,96.Атака выполняется всего за несколько секунд на обычном компьютере.
Коллизию MD5 легко сконструировать, и проверить целостность данных на основе MD5 ненадежно.Учитывая, что Google недавно успешно создал экземпляр коллизии SHA-1 (англ. Secure Hash Algorithm 1, китайское название: Secure Hash Algorithm 1), Для обеспечения целостности данных вместо этого следует использовать SHA256 или более сильный.
На самом деле, все еще существует много связанных знаний о MD5, таких как обратный запрос зашифрованного текста MD5, засолка паролей и защита от кражи контентных ресурсов. Брат А Бао больше не будет распространяться здесь. Заинтересованные друзья могут прочитать то, что Брат А Бао написал ранее.«Понимание алгоритма MD5 в одной статье»Эта статья.
5. Справочные ресурсы
В этой статье используетсяmdniceнабор текста