¡Cifrado Hutool-crypto, detalles de descifrado!

1. Introducción

En el proceso de desarrollo de Java, se requieren cifrado y descifrado en muchos escenarios.

Por ejemplo, cifrado de datos confidenciales, cifrado de información del archivo de configuración, cifrado de datos de comunicación, etc.

La introducción de hoy es el módulo de cifrado crypto en el kit de herramientas de Hutool  .

2. Clasificación de cifrado

El cifrado se divide en tres categorías:

  • Cifrado simétrico (simétrico)

    Los más utilizados son AES, DES.

  • Cifrado asimétrico (asimétrico)

    Los más utilizados son RSA, DSA

  • Cifrado de resumen (resumen)

    Los más utilizados son MD5, SHA-1

3. Introducción general del módulo criptográfico.

inserte la descripción de la imagen aquí

  • herramienta clave
  • Herramienta de cifrado y descifrado
  • BCUtil
  • Algoritmo secreto nacional SmUtil

inserte la descripción de la imagen aquí

4. Cifrado de resumen (Resumen)

4.1 Indirecto

El algoritmo abstracto es un algoritmo que puede generar un formato de salida especial. Las características de este algoritmo son: no importa la longitud que el usuario ingrese los datos originales, la salida de texto cifrado después del cálculo es de longitud fija. El principio de este algoritmo es alguna forma de La extracción se realiza de acuerdo con ciertas reglas de operación, esta extracción es el resumen, que está más relacionado con los metadatos que el resumen. Siempre que los datos de origen cambien ligeramente, el "resumen" de salida será completamente diferente, por lo que los algoritmos basados ​​en este principio pueden proporcionar garantías sólidas para la integridad de los datos.

Sin embargo, dado que el texto cifrado de salida es un valor de longitud fija procesado mediante la extracción de metadatos, no se puede restaurar a los datos originales, es decir, el algoritmo de resumen del mensaje es irreversible. En teoría, el contenido de los metadatos no se puede obtener mediante la operación inversa. Por lo tanto, su valor habitual se puede utilizar para verificar la integridad de los datos.

4.2 uso

Esto introduce principalmente el cifrado md5.

uso básico

/**
 *  md5的基本使用
 *  生成32位的密文
 */
@Test
public void MD5BasicTest() {
    System.out.println(new String(DigestUtil.md5("testaaa")));
    // 返回16进制形式  de2ec3065687316991579e6b9e6ce143
    System.out.println(DigestUtil.md5Hex("testaa"));
}

Sal, ubicación de la sal, número de digestiones.

/**
 *  md5的高级使用
 *      加盐  加盐的位置  摘要次数
 */
@Test
public void MD5Test() {
    // 加盐  加盐的位置  摘要次数
    String salt = "md5Salt";
    int index = 0;
    int count = 2;
    MD5 md5 = new MD5(salt.getBytes(StandardCharsets.UTF_8), index, count);
    // 返回16进制格式
    System.out.println(md5.digestHex("testaa"));;
}

5. Cifrado simétrico (simétrico)

5.1 Introducción

El cifrado simétrico (es decir, el cifrado de clave privada) se refiere a un algoritmo de cifrado que utiliza la misma clave secreta para cifrar y descifrar. A veces también se le llama algoritmo criptográfico tradicional, es decir, la clave de cifrado se puede calcular a partir de la clave de descifrado y la clave secreta también se puede calcular a partir de la clave de cifrado. En la mayoría de los algoritmos simétricos, la clave de cifrado y la clave de descifrado son las mismas, por lo que este algoritmo también se denomina algoritmo de clave privada o algoritmo de clave única.

Requiere que el remitente y el receptor acuerden una clave secreta antes de comunicarse de forma segura.

La seguridad del algoritmo simétrico depende de la clave secreta. Filtrar la clave secreta significa que cualquiera puede descifrar los mensajes que envía y recibe, por lo que el secreto de la clave secreta es muy importante para la seguridad de la comunicación.

5.2 uso

AES se presenta aquí

uso básico

/**
 * 简单使用,直接使用秘钥加密解密
 */
@Test
public void AESBasicTest() {
    // 生成秘钥,也可以手动指定
    byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();

    // 构建
    SymmetricCrypto symmetricCrypto = new SymmetricCrypto(SymmetricAlgorithm.AES, key);
    // 加密
    System.out.println(new String(symmetricCrypto.encrypt("testaa")));
    // 生成16进制格式的
    System.out.println(symmetricCrypto.encryptHex("testaa"));

    // 解密
    System.out.println(new String(symmetricCrypto.decrypt(symmetricCrypto.encrypt("testaa"))));
    // 直接解密字符串
    System.out.println(symmetricCrypto.decryptStr(symmetricCrypto.encryptHex("testaa")));
}

uso avanzado

/**
 * AES 高级使用
 *      mode – 模式Mode
 *      padding – Padding补码方式
 *      key – 密钥,支持三种密钥长度:128、192、256位
 *      iv – 偏移向量,加盐   必须16位
 *
 *  缺点,受到iv的影响,加密的字符串要么为空,要么为16位以上
 */
@Test
public void AESTest() {
    // 生成秘钥,也可以手动指定
    byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
    String iv = "testiv0000000000";

    AES aes = new AES(Mode.CTS, Padding.PKCS5Padding, key, iv.getBytes(StandardCharsets.UTF_8));

    // 加密
    System.out.println(aes.encryptHex("testaa1234567899"));
    // 解密
    System.out.println(aes.decryptStr(aes.encrypt("testaa1234567899")));
}

6. Cifrado asimétrico (asimétrico)

6.1 Introducción

Para el cifrado asimétrico, los más utilizados son RSA y DSA.

El cifrado sin almacenamiento tiene dos conceptos de clave pública y clave privada: la clave privada es propiedad de uno mismo y la clave pública se hace pública. Dependiendo de la aplicación, podemos optar por utilizar diferentes claves para el cifrado.

  1. Firma: Cifrada con la clave privada y descifrada con la clave pública. Se utiliza para permitir que los propietarios de todas las claves públicas verifiquen la identidad del propietario de la clave privada y para evitar que el contenido publicado por el propietario de la clave privada sea manipulado, pero no para garantizar que otros no obtengan el contenido;
  2. Cifrado: cifrar con clave pública y descifrar con clave privada. Esta información, que se utiliza para publicar galaxias a los propietarios de claves públicas, puede ser manipulada por ellos, pero otros no pueden obtenerla.

6.2 Uso

Presentamos RSA aquí

uso básico

/**
 * 基本使用
 */
@Test
public void RSABasicTest() {
    RSA rsa = new RSA();
    // 获取公钥和私钥
    System.out.println(rsa.getPublicKey());
    System.out.println(rsa.getPrivateKeyBase64());
    System.out.println(rsa.getPrivateKey());
    System.out.println(rsa.getPrivateKeyBase64());
    // 私钥加密,公钥解密
    System.out.println(new String(rsa.encrypt("testaa", KeyType.PrivateKey)));
    System.out.println(new String(rsa.decrypt(rsa.encrypt("testaa", KeyType.PrivateKey), KeyType.PublicKey)));
    // 公钥加密,私钥解密
    System.out.println(new String(rsa.encrypt("testaa", KeyType.PublicKey)));
    System.out.println(new String(rsa.decrypt(rsa.encrypt("testaa", KeyType.PublicKey), KeyType.PrivateKey)));
}

 uso avanzado

/**
 * 高级使用
 *  自定义生成 公钥和私钥
 */
@Test
public void RSATest() {
    KeyPair keyPair = SecureUtil.generateKeyPair(AsymmetricAlgorithm.RSA.getValue());
    PrivateKey privateKey = keyPair.getPrivate();
    PublicKey publicKey = keyPair.getPublic();
    System.out.println(publicKey);
    System.out.println(privateKey);
    System.out.println("----------");

    RSA rsa = new RSA(privateKey, publicKey);
    // 私钥加密,公钥解密
    System.out.println(new String(rsa.encrypt("testaa", KeyType.PrivateKey)));
    System.out.println(new String(rsa.decrypt(rsa.encrypt("testaa", KeyType.PrivateKey), KeyType.PublicKey)));
    // 公钥加密,私钥解密
    System.out.println(new String(rsa.encrypt("testaa", KeyType.PublicKey)));
    System.out.println(new String(rsa.decrypt(rsa.encrypt("testaa", KeyType.PublicKey), KeyType.PrivateKey)));

}

7. Algoritmo Secreto Nacional (SM)

Hutool ha Bouncy Castlecreado un paquete simplificado para implementar SM2, SM3 y SM4 en el algoritmo secreto nacional. .

El paquete de herramientas de algoritmo secreto nacional incluye:

  • Cifrado y firma asimétricos: SM2
  • Algoritmo de firma de resumen: SM3
  • Cifrado simétrico: SM4

El algoritmo secreto nacional necesita introducir  Bouncy Castle dependencias de bibliotecas.

Esta no es una introducción.

Supongo que te gusta

Origin blog.csdn.net/dreaming317/article/details/130164879
Recomendado
Clasificación