Это 73-я оригинальная статья без воды.Если вы хотите получить больше оригинальных статей, выполните поиск в официальном аккаунте и подпишитесь на нас~ Эта статья была впервые опубликована в блоге Zhengcaiyun:Схема и реализация шифрования конфиденциальных данных
предисловие
Сейчас эпоха больших данных, и для статистики необходимо собирать большое количество личной информации. С одной стороны, это приносит нам удобство, с другой стороны, некоторые личные данные утекают непреднамеренно и используются нелегальными элементами для продвижения и черного промысла.
25 мая 2018 года ЕС ввел в действие Общие положения о защите данных (Общее положение о защите данных). Постановление является спецификацией всего законодательства ЕС о защите данных и конфиденциальности. Это означает, что личные данные должны храниться с использованием псевдонима или анонимности, и по умолчанию, поскольку используются самые высокие настройки конфиденциальности, чтобы избежать утечки данных.
Я считаю, что мы также не хотим выпускать из себя "полосы". Итак, как фронтенд разработчики должны стараться избегать передачи персональных данных пользователя, максимально снижать риск утечки информации.
Увидев это, некоторые люди могут сказать, что сейчас используется HTTPS, данные при передаче шифруются, и интерфейс не нужно шифровать. На самом деле нет, я могу использовать плагин Google для сбора личной информации в HTTPS-запросах перед их отправкой, что я продемонстрирую ниже. Так что внешнее шифрование данных по-прежнему необходимо.
Способы утечки данных
-
атака «человек посередине»
Атака «человек посередине» является распространенным методом атаки. Подробный процесс см.здесь. Общий процесс заключается в том, что посредник перехватывает сеанс между клиентом и сервером с помощью спуфинга DNS и других средств.
Информация между клиентом и сервером будет проходить через посредника, а посредник может получать и пересылать информацию обоих. При HTTP внешнее шифрование данных по-прежнему не может избежать утечки данных, потому что посредник может подделать ключ. Чтобы избежать атак «человек посередине», мы обычно используем HTTPS для передачи.
-
Плагин Google
Хотя HTTPS может предотвратить перехват данных во время передачи по сети, данные все же могут быть утеряны из подключаемого модуля Google перед отправкой HTTPS.
Поскольку подключаемый модуль Google может перехватывать все запросы в Сети, при наличии вредоносного кода в некоторых подключаемых модулях информация о пользователе все равно может быть получена, как показано ниже.
Следовательно, при использовании только HTTPS некоторая конфиденциальная информация небезопасна, если она по-прежнему передается в виде открытого текста. Если шифрование данных выполняется на основе HTTPS, то оно относительно лучше.
Введение в алгоритмы шифрования
-
Симметричное шифрование
Алгоритм симметричного шифрования, также известный как алгоритм шифрования с общим ключом. В алгоритме симметричного шифрования используется только один ключ, и отправитель, и получатель используют этот ключ для шифрования и расшифровки данных.
Это требует, чтобы и шифрующая, и дешифрующая стороны заранее знали ключ шифрования. Преимущество в том, что алгоритм открытый, объем вычислений небольшой, скорость шифрования высокая, а эффективность шифрования высокая; недостаток в том, что данные будут взломаны после утечки ключа. Как правило, не рекомендуется использовать в одиночку. В соответствии с различными механизмами реализации общие алгоритмы в основном включаютAES,ChaCha20,3DESЖдать.
-
Асимметричное шифрование
Алгоритм асимметричного шифрования, также известный как алгоритм шифрования с открытым ключом. Для этого требуется два ключа, один называется открытым ключом, который является открытым ключом, а другой называется закрытым ключом, который является закрытым ключом.
Они парные, как отношения между ключом и замком. Поскольку для шифрования и дешифрования используются два разных ключа, этот алгоритм называется алгоритмом асимметричного шифрования. Преимущество состоит в том, что алгоритм имеет комплексную стойкость и высокую безопасность, а недостаток в том, что скорость шифрования и дешифрования не такая высокая, как у алгоритма симметричного шифрования. Наиболее распространены алгоритмыRSA,ElgamalЖдать.
-
хеш-алгоритм
Алгоритм хеширования, также известный как хеш-функция, хэш-функция, заключается в сжатии сообщений или данных в дайджесты, уменьшении объема данных и фиксировании формата данных до значения определенной длины. Обычно он используется для проверки целостности данных.Обычно, когда мы загружаем файл, мы можем проверить MD5, чтобы определить, являются ли загруженные данные полными. Наиболее распространены алгоритмыMD4,MD5,SHAЖдать.
План реализации
-
Вариант 1. Если используется симметричное шифрование, и сервер, и клиент должны знать ключ. Сервер должен отправить ключ клиенту.Этот процесс не является безопасным, поэтому использование только симметричного шифрования не сработает.
-
Вариант 2. Если используется асимметричное шифрование, данные клиента шифруются с помощью открытого ключа, сервер расшифровывается с помощью закрытого ключа, и клиент без проблем отправляет данные для шифрования. Когда клиент принимает данные, сервер должен зашифровать их с помощью открытого ключа, а затем клиент расшифрует их с помощью закрытого ключа. Следовательно, для этой схемы требуется два набора открытых и закрытых ключей, а также необходимо генерировать собственные ключи на клиенте и сервере.
-
Вариант 3: если сочетаются симметричное шифрование и асимметричное шифрование. Клиенту необходимо сгенерировать симметричный ключ шифрования 1, содержимое передачи и ключ 1 симметрично шифруются и отправляются на сервер, а ключ 1 и открытый ключ асимметрично шифруются, а затем также передаются на сервер. Сервер расшифровывает симметрично зашифрованный ключ 1 с помощью закрытого ключа, а затем расшифровывает содержимое с помощью ключа 1. Выше приведен процесс от клиента к серверу. Если сервер хочет отправить данные клиенту, ему необходимо зашифровать данные ответа с помощью симметричного ключа шифрования 1, а затем клиент получает зашифрованный текст и расшифровывает его с помощью ключа клиента 1 для завершения зашифрованной передачи.
-
Резюме: Выше приведен только список распространенных схем шифрования. В целом, вторая схема относительно проста, но требует поддержки двух наборов открытых и закрытых ключей.При изменении открытого ключа необходимо уведомлять другую сторону, а гибкость относительно низкая. По сравнению со второй схемой, ключ 1 можно изменить в любой момент, и сервер не нужно уведомлять.Это относительно гибко и безопасно, а третья схема симметрично зашифрована.При большом объеме данных симметричное шифрование Скорость будет выше, чем при асимметричном шифровании. Поэтому в этой статье для реализации кода используется третья схема.
Код
-
Ниже приведена конкретная реализация кода (в качестве примера возьмем интерфейс входа в систему), основной целью которого является преобразование личной информации в виде открытого текста в зашифрованный текст для передачи. Библиотека симметричного шифрования использует AES, а библиотека асимметричного шифрования использует RSA.
-
Клиент:
-
AES Библиотека (AES-JS):GitHub.com/Затонувшие О/AES-…
-
Библиотека RSA (jsencrypt):GitHub.com/Трэвис Т/Роль…
-
Конкретный код реализует интерфейс входа в систему
-
Клиент должен случайным образом сгенерировать ключ aesKey, а когда страница загружается, ему необходимо запросить открытый ключ с сервера.
let aesKey = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; // 随机产生 let publicKey = ""; // 公钥会从服务端获取 // 页面加载完之后,就去获取公钥 window.onload = () => { axios({ method: "GET", headers: { "content-type": "application/x-www-form-urlencoded" }, url: "http://localhost:3000/getPub", }) .then(function (result) { publicKey = result.data.data; // 获取公钥 }) .catch(function (error) { console.log(error); }); };
-
методы шифрования и дешифрования aes
/** * aes加密方法 * @param {string} text 待加密的字符串 * @param {array} key 加密key */ function aesEncrypt(text, key) { const textBytes = aesjs.utils.utf8.toBytes(text); // 把字符串转换成二进制数据 // 这边使用CTR-Counter加密模式,还有其他模式可以选择,具体可以参考aes加密库 const aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5)); const encryptedBytes = aesCtr.encrypt(textBytes); // 进行加密 const encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes); // 把二进制数据转成十六进制 return encryptedHex; } /** * aes解密方法 * @param {string} encryptedHex 加密的字符串 * @param {array} key 加密key */ function aesDecrypt(encryptedHex, key) { const encryptedBytes = aesjs.utils.hex.toBytes(encryptedHex); // 把十六进制数据转成二进制 const aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5)); const decryptedBytes = aesCtr.decrypt(encryptedBytes); // 进行解密 const decryptedText = aesjs.utils.utf8.fromBytes(decryptedBytes); // 把二进制数据转成utf-8字符串 return decryptedText; }
-
Запросить логин
/** * 登陆接口 */ function submitFn() { const userName = document.querySelector("#userName").value; const password = document.querySelector("#password").value; const data = { userName, password, }; const text = JSON.stringify(data); const sendData = aesEncrypt(text, aesKey); // 把要发送的数据转成字符串进行加密 console.log("发送数据", text); const encrypt = new JSEncrypt(); encrypt.setPublicKey(publicKey); const encrypted = encrypt.encrypt(aesKey.toString()); // 把aesKey进行非对称加密 const url = "http://localhost:3000/login"; const params = { id: 0, data: { param1: sendData, param2: encrypted } }; axios({ method: "POST", headers: { "content-type": "application/x-www-form-urlencoded" }, url: url, data: JSON.stringify(params), }) .then(function (result) { const reciveData = aesDecrypt(result.data.data, aesKey); // 用aesKey进行解密 console.log("接收数据", reciveData); }) .catch(function (error) { console.log("error", error); }); }
-
-
-
Сервер (узел):
-
Библиотека AES (aes-js):GitHub.com/Затонувшие О/AES-…
-
Библиотека RSA (узел-rsa):GitHub.com/серьезный кодер/nod…
-
Конкретный код реализует интерфейс входа в систему
-
Ссылка на криптобиблиотеку
const http = require("http"); const aesjs = require("aes-js"); const NodeRSA = require("node-rsa"); const rsaKey = new NodeRSA({ b: 1024 }); // key的size为1024位 let aesKey = null; // 用于保存客户端的aesKey let privateKey = ""; // 用于保存服务端的公钥 rsaKey.setOptions({ encryptionScheme: "pkcs1" }); // 设置加密模式
-
Реализовать интерфейс входа
http .createServer((request, response) => { response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Headers", "Content-Type"); response.setHeader("Content-Type", "application/json"); switch (request.method) { case "GET": if (request.url === "/getPub") { const publicKey = rsaKey.exportKey("public"); privateKey = rsaKey.exportKey("private"); response.writeHead(200); response.end(JSON.stringify({ result: true, data: publicKey })); // 把公钥发送给客户端 return; } break; case "POST": if (request.url === "/login") { let str = ""; request.on("data", function (chunk) { str += chunk; }); request.on("end", function () { const params = JSON.parse(str); const reciveData = decrypt(params.data); console.log("reciveData", reciveData); // 一系列处理之后 response.writeHead(200); response.end( JSON.stringify({ result: true, data: aesEncrypt( JSON.stringify({ userId: 123, address: "杭州" }), // 这个数据会被加密 aesKey ), }) ); }); return; } break; default: break; } response.writeHead(404); response.end(); }) .listen(3000);
-
Методы шифрования и дешифрования
function decrypt({ param1, param2 }) { const decrypted = rsaKey.decrypt(param2, "utf8"); // 解密得到aesKey aesKey = decrypted.split(",").map((item) => { return +item; }); return aesDecrypt(param1, aesKey); } /** * aes解密方法 * @param {string} encryptedHex 加密的字符串 * @param {array} key 加密key */ function aesDecrypt(encryptedHex, key) { const encryptedBytes = aesjs.utils.hex.toBytes(encryptedHex); // 把十六进制转成二进制数据 const aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5)); // 这边使用CTR-Counter加密模式,还有其他模式可以选择,具体可以参考aes加密库 const decryptedBytes = aesCtr.decrypt(encryptedBytes); // 进行解密 const decryptedText = aesjs.utils.utf8.fromBytes(decryptedBytes); // 把二进制数据转成字符串 return decryptedText; } /** * aes加密方法 * @param {string} text 待加密的字符串 * @param {array} key 加密key */ function aesEncrypt(text, key) { const textBytes = aesjs.utils.utf8.toBytes(text); // 把字符串转成二进制数据 const aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5)); const encryptedBytes = aesCtr.encrypt(textBytes); // 加密 const encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes); // 把二进制数据转成十六进制 return encryptedHex; }
-
-
Демонстрационный эффект
Суммировать
В этой статье в основном представлены некоторые знания о внешней безопасности и реализации конкретных схем шифрования. Чтобы защитить личные данные клиентов, будь то HTTP или HTTPS, рекомендуется передавать информацию в зашифрованном виде, чтобы взломщик мог увеличить сложность атаки. Конечно, шифрование и дешифрование данных также принесут определенное потребление производительности, которое необходимо измерять каждому разработчику.
использованная литература
Прочитав эту статью, моя бабушка понимает о принципе HTTPS
Рекомендуемое чтение
Анализ исходного кода vue-router и назначение разрешений динамической маршрутизации
Написание качественного поддерживаемого кода: обзор комментариев
Карьера
ZooTeam, молодая, увлеченная и творческая команда, связанная с отделом исследований и разработок продукции Zhengcaiyun, базируется в живописном Ханчжоу. В настоящее время в команде более 40 фронтенд-партнеров, средний возраст которых составляет 27 лет, и почти 30% из них — инженеры полного стека, настоящая молодежная штурмовая группа. В состав членов входят «ветераны» солдат из Ali и NetEase, а также первокурсники из Чжэцзянского университета, Университета науки и технологий Китая, Университета Хандянь и других школ. В дополнение к ежедневным деловым связям, команда также проводит технические исследования и фактические боевые действия в области системы материалов, инженерной платформы, строительной платформы, производительности, облачных приложений, анализа и визуализации данных, а также продвигает и внедряет ряд внутренних технологий. Откройте для себя новые горизонты передовых технологических систем.
Если вы хотите измениться, вас забрасывают вещами, и вы надеетесь начать их бросать; если вы хотите измениться, вам сказали, что вам нужно больше идей, но вы не можете сломать игру; если вы хотите изменить , у вас есть возможность добиться этого результата, но вы не нужны; если вы хотите изменить то, чего хотите достичь, вам нужна команда для поддержки, но вам некуда вести людей; если вы хотите изменить установившийся ритм, это будет "5 лет рабочего времени и 3 года стажа работы"; если вы хотите изменить исходный Понимание хорошее, но всегда есть размытие того слоя оконной бумаги.. , Если вы верите в силу веры, верьте, что обычные люди могут достичь необыкновенных вещей, и верьте, что они могут встретить лучшего себя. Если вы хотите участвовать в процессе становления бизнеса и лично способствовать росту фронтенд-команды с глубоким пониманием бизнеса, надежной технической системой, технологиями, создающими ценность, и побочным влиянием, я думаю, что мы должны говорить. В любое время, ожидая, пока вы что-нибудь напишете, отправьте это наZooTeam@cai-inc.com