внешнее шифрование

JavaScript

Прелюдия

Когда проект компании недавно передавал данные, отдел тестирования обнаружил, что данные типа пароля передавались в открытом тексте после проверки безопасности, что решительно не соответствовало требованиям.Пусть шифрование будет соблюдено.

сцены, которые будут использоваться

Когда интерфейс и сервер используют протокол HTTP для взаимодействия, поскольку пакеты HTTP являются открытым текстом, обычно более конфиденциальная информация может быть зашифрована на интерфейсе с помощью шифрования, а затем расшифрована на сервере для достижения эффект «путаницы», чтобы избежать процесса передачи Раскрытие конфиденциальной информации (такой как пароли, информация сертификата и т. д.). Однако фронтальное шифрование может обеспечить только «запутывание» информации в процессе передачи.Эксперты все же могут получить данные с помощью отладчика, что небезопасно.Так называемое фронтальное шифрование лишь незначительно увеличивает стоимость злоумышленника, и настоящая безопасность не может быть гарантирована.
Подводя итог, сервер не должен полагать, что зашифрованный текст, переданный от внешнего интерфейса, хранится непосредственно в базе данных и может быть зашифрован и сохранен только самим сервером. Так что, внешнее шифрование не имеет смысла? Ответ — нет, по крайней мере, можно гарантировать, что процесс передачи не является передачей открытого текста.Если для взаимодействия между интерфейсом и сервером требуется безопасный канал, рекомендуется использовать для связи протокол HTTPS.

Классификация

Проще говоря, есть два способа шифрования

  • Симметричное шифрование
    Симметричное шифрование использует технологию кодирования симметричного шифра.Его характеристика заключается в том, что шифрование файла и дешифрование используют один и тот же ключ для шифрования, то есть ключ может также использоваться в качестве ключа дешифрования.Этот метод называется симметричным алгоритмом шифрования в криптографии, симметричным алгоритмом шифрования , Он прост и быстр в использовании, ключ короткий и его трудно расшифровать.Помимо стандарта шифрования данных (DES), другой системой шифрования с симметричным ключом является Международный алгоритм шифрования данных (IDEA), который лучше чем DES. Не такой требовательный
    Распространенными алгоритмами симметричного шифрования являются DES, 3DES, Blowfish, IDEA, RC4, RC5, RC6 и AES.
  • Асимметричное шифрование
    Алгоритмы асимметричного шифрования требуют два ключа: открытый ключ и закрытый ключ. Открытый ключ и закрытый ключ представляют собой пару. Если данные зашифрованы с помощью открытого ключа, их можно расшифровать только с помощью соответствующего закрытого ключа; если данные зашифрованы с помощью закрытого ключа, можно расшифровать только соответствующий открытый ключ. . Поскольку для шифрования и дешифрования используются два разных ключа, этот алгоритм называется алгоритмом асимметричного шифрования. Основной процесс алгоритма асимметричного шифрования для осуществления обмена конфиденциальной информацией состоит в следующем: Сторона А генерирует пару ключей и раскрывает один из них другим сторонам в качестве открытого ключа; Сторона Б, получившая открытый ключ, использует его для шифрования данных. Конфиденциальная информация. Затем отправьте ее Стороне А. Затем Сторона А расшифрует зашифрованную информацию другим закрытым ключом, хранящимся у нее. Сторона А может использовать только свой закрытый ключ для расшифровки любой информации, зашифрованной ее открытым ключом.
    Распространенными алгоритмами асимметричного шифрования являются: RSA, ECC (для мобильных устройств), Diffie-Hellman, El Gamal, DSA (для цифровых подписей).

Реализация симметричного шифрования DES

(1) Используйте Crypto-JS для шифрования на переднем конце с помощью алгоритма DES.

npm install crypto-js

(2) Шифрование и дешифрование
Используя алгоритм DES, рабочий метод — ECB, а метод заполнения — PKcs7.

var CryptoJS = require("crypto-js");
const secretKey = 'com.sevenlin.foo.key';
var afterEncrypt = CryptoJS.DES.encrypt('encryptCode', CryptoJS.enc.Utf8.parse(secretKey), {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
}).toString()
console.log(afterEncrypt);//8/nZ2vZXxOzPhU7ZHBwz7w==
var afterDecrypt = CryptoJS.DES.decrypt(afterEncrypt, CryptoJS.enc.Utf8.parse(secretKey), {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
console.log(afterDecrypt);//encryptCode

(3) Используйте BC для расшифровки на серверной части с помощью алгоритма DES.
а. установить

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk16</artifactId>
    <version>1.46</version>
</dependency>

б. Инструменты шифрования и дешифрования

public class DesCipherUtil {

    private DesCipherUtil() {
        throw new AssertionError("No DesCipherUtil instances for you!");
    }

    static {
        // add BC provider
        Security.addProvider(new BouncyCastleProvider());
    }

    /**
     * 加密
     * 
     * @param encryptText 需要加密的信息
     * @param key 加密密钥
     * @return 加密后Base64编码的字符串
     */
    public static String encrypt(String encryptText, String key) {

        if (encryptText == null || key == null) {
            throw new IllegalArgumentException("encryptText or key must not be null");
        }

        try {
            DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());
            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec);

            Cipher cipher = Cipher.getInstance("DES/ECB/PKCS7Padding", "BC");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] bytes = cipher.doFinal(encryptText.getBytes(Charset.forName("UTF-8")));
            return Base64.getEncoder().encodeToString(bytes);

        } catch (NoSuchAlgorithmException | InvalidKeyException | InvalidKeySpecException | NoSuchPaddingException
            | BadPaddingException | NoSuchProviderException | IllegalBlockSizeException e) {
            throw new RuntimeException("encrypt failed", e);
        }

    }

    /**
     * 解密
     * 
     * @param decryptText 需要解密的信息
     * @param key 解密密钥,经过Base64编码
     * @return 解密后的字符串
     */
    public static  String decrypt(String decryptText, String key) {

        if (decryptText == null || key == null) {
            throw new IllegalArgumentException("decryptText or key must not be null");
        }

        try {
            DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());
            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec);

            Cipher cipher = Cipher.getInstance("DES/ECB/PKCS7Padding", "BC");
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            byte[] bytes = cipher.doFinal(Base64.getDecoder().decode(decryptText));
            return new String(bytes, Charset.forName("UTF-8"));

        } catch (NoSuchAlgorithmException | InvalidKeyException | InvalidKeySpecException | NoSuchPaddingException
            | BadPaddingException | NoSuchProviderException | IllegalBlockSizeException e) {
            throw new RuntimeException("decrypt failed", e);
        }
    }
}

в. Расшифровать зашифрованную информацию внешнего интерфейса

String fromWeb = "8/nZ2vZXxOzPhU7ZHBwz7w==";
String key = "com.sevenlin.foo.key";
String afterDecrypt = DesCipherUtil.decrypt(fromWeb, key);
System.out.println(afterDecrypt);//encryptCode

Асимметричное шифрование

(1)Скачать зависимости зашифрованных файлов
(2) Введите зависимости

<script src="bin/jsencrypt.min.js"></script>

или

import '../../assets/js/jsencrypt.min.js';

(3) Как использовать

this.privateKey=`-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQ
WMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76xFxdU6jE0NQ+Z+zEdhUTooNR
aY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQAB
AoGAfY9LpnuWK5Bs50UVep5c93SJdUi82u7yMx4iHFMc/Z2hfenfYEzu+57fI4fv
xTQ//5DbzRR/XKb8ulNv6+CHyPF31xk7YOBfkGI8qjLoq06V+FyBfDSwL8KbLyeH
m7KUZnLNQbk8yGLzB3iYKkRHlmUanQGaNMIJziWOkN+N9dECQQD0ONYRNZeuM8zd
8XJTSdcIX4a3gy3GGCJxOzv16XHxD03GW6UNLmfPwenKu+cdrQeaqEixrCejXdAF
z/7+BSMpAkEA8EaSOeP5Xr3ZrbiKzi6TGMwHMvC7HdJxaBJbVRfApFrE0/mPwmP5
rN7QwjrMY+0+AbXcm8mRQyQ1+IGEembsdwJBAN6az8Rv7QnD/YBvi52POIlRSSIM
V7SwWvSK4WSMnGb1ZBbhgdg57DXaspcwHsFV7hByQ5BvMtIduHcT14ECfcECQATe
aTgjFnqE/lQ22Rk0eGaYO80cc643BXVGafNfd9fcvwBMnk0iGX0XRsOozVt5Azil
psLBYuApa66NcVHJpCECQQDTjI2AQhFc1yRnCU/YgDnSpJVm1nASoRUnU8Jfm3Oz
uku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876
-----END RSA PRIVATE KEY-----`;
              this.publicKye=`-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlOJu6TyygqxfWT7eLtGDwajtN
FOb9I5XRb6khyfD1Yt3YiCgQWMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76
xFxdU6jE0NQ+Z+zEdhUTooNRaY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4
gwQco1KRMDSmXSMkDwIDAQAB
-----END PUBLIC KEY-----`;
  var encrypt = new JSEncrypt();
  encrypt.setPublicKey(this.publicKye);
  var encrypted = encrypt.encrypt('encryptCode');//w1a1FXmlbFj9yOxLCoqIzNo2ytXypyupZABsi/e4kMA9mERngmaDwlOuHsUDQKC0nK1v7Ehr3vYKcALFQvjscWEkGIW/UWCk73jArwqEYF1wd45eHSCPwUeB85Ellr+IYTqhZXcfmHZUCuprF2gayPUecq7F51aWxpfqMP0uvtY=
  // Decrypt with the private key...
  var decrypt = new JSEncrypt();
  decrypt.setPrivateKey(this.privateKey);
  var uncrypted = decrypt.decrypt(encrypted);//encryptCode

Сгенерировать публичный ключ и приватный ключонлайн-адрес

Хотя внешний интерфейс может быть зашифрован, в конце концов, это небезопасный способ.Если вы все еще используете передачу https для большей безопасности, задний конец шифруется и сохраняется!

Справочная статья:
Шифрование JavaScript и дешифрование Java через DES
библиотека шифрования