Implementación del algoritmo SM4 en Java: Flujo completo de cifrado y descifrado entre formato Hexadecimal y Base64

En aplicaciones prácticas, SM4 es esencial para proteger información sensible durante la transmisión, como números de identificación o números de teléfono, así como para almacenar datos de forma segura en bases de datos. A diferencia de funciones hash como MD5, SM4 es reversible, lo que permite recuperar los datos originales con la clave correcta, siendo ideal para escenarios que requieern confidencialidad y recuperabilidad.

Este artículo explora el flujo de trabajo completo para cifrar y descifrar datos utilizando el algoritmo SM4 en Java, centrándose en la conversión entre formatos Hexadecimal (Hex) y Base64. Se empleará la biblioteca Hutool para simplificar la implementación.

Configuración del entorno y dependencias

Para implementar SM4 en Java, se recomienda utilizar la biblioteca Hutool, que abstrae operaciones complejas en métodos sencillos. Hutool depende de Bouncy Castle como proveedor de cifrado subyacente para los algoritmos nacionales. Ambas depenedncias deben incluirse en el proyecto.

En un proyecto Maven, agrega las siguientes dependencias al archivo pom.xml:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.18</version>
</dependency>
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15to18</artifactId>
    <version>1.70</version>
</dependency>

Hutool proporciona la funcionalidad de cifrado SM4, mientras que Bouncy Castle habilita la implementación del algoritmo. Sin la segunda dependencia, el algoritmo SM4 no estará disponible. Asegúrate de que las versiones sean compatibles con el JDK de tu proyecto; por ejemplo, para JDK 8, puedes usar bcprov-jdk15on.

Generación y gestión de claves

La clave es un componente fundamental en el cifrado SM4. Debe ser una secuencia de 16 bytes (128 bits). Para mayor seguridad, se recomienda generar claves aleatorias en lugar de usar valores estáticos, ya que las claves hardcodeadas representan un riesgo si se filtran.

Una forma segura es generar una clave usando un generador de números aleatorios criptográficamente seguro. Con Hutool, esto se puede lograr de la siguiente manera:

import cn.hutool.crypto.SecureUtil;
import cn.hutool.core.util.HexUtil;

// Generar una clave aleatoria de 128 bits (16 bytes)
byte[] claveGenerada = SecureUtil.generateKey(SymmetricAlgorithm.SM4.getValue()).getEncoded();
// Convertir el arreglo de bytes a una cadena hexadecimal para almacenamiento
String claveSm4Hex = HexUtil.encodeHexStr(claveGenerada);
System.out.println("Clave SM4 generada en formato Hex: " + claveSm4Hex);
// La salida podría ser similar a: 8a2b3c4d5e6f70819203a4b5c6d7e8f9

Las claves generadas deben almacenarse de manera segura, por ejemplo, en variables de entorno del servidor, un centro de configuración dedicado o módulos de seguridad de hardware (HSM). Nunca deben incluirse en archivos de configuración del proyecto o repositorios de código.

Alternativamente, se puede derivar una clave a partir de una contraseña mediante funciones como PBKDF2, combinando un valor aleatorio (salt) y múltiples iteraciones para obtener la longitud requerida. Este enfoque es útil cuando la clave depende de una entrada de usuario, pero para servicios backend, la generación aleatoria es más común.

Etiquetas: SM4 Hutool java cifrado-simétrico base64

Publicado el 7-2 01:23