Este artículo presenta principalmente los algoritmos de cifrado de uso común para la implementación de Java: algoritmos de cifrado unidireccional MD5 y SHA, como sigue:
1. Arquitectura de seguridad de Java
1.1 Introducción a la arquitectura de seguridad de Java
Proporcione clases e interfaces para marcos de seguridad en Java. La API de seguridad JDK es la API central del lenguaje de programación Java, ubicado en el paquete Java.Security (y sus subpackages), así como el paquete Sun.SecurityApi (y sus subpackages). Diseñado para ayudar a los desarrolladores a utilizar características de seguridad de bajo nivel y avanzadas en sus programas.
La primera versión de JDK en JDK 1.1 introdujo la "Arquitectura de cifrado Java" (JCA), que se refiere a la arquitectura utilizada para acceder y desarrollar funciones de contraseña de plataforma Java. En JDK 1.1, JCA incluye una API para firmas digitales y digestiones de mensajes. JDK 1.2 extiende enormemente la arquitectura de cifrado Java, también actualiza la infraestructura de administración de certificados para admitir certificados X.509 V3 e introduce una nueva arquitectura de seguridad Java para un control de acceso de grano fino, configurable, flexible y extensible.
La arquitectura de cifrado Java incluye las partes relacionadas con la contraseña de la API de seguridad JDK 1.2, así como un conjunto de convenciones y especificaciones proporcionadas en este documento. Para implementar múltiples contraseñas interoperables, también proporciona una arquitectura de "proveedor".
Java Password Extension (JCE)) extiende la API JCA, incluidas las API para el cifrado, el intercambio de claves y los códigos de autenticación de información (MAC). Las contraseñas JCE y JDK juntas proporcionan una API de contraseña completa que no está relacionada con la plataforma. JCE como una extensión de JDK se publicará de forma independiente para cumplir con las limitaciones de control de exportación de los Estados Unidos.
1.2 Código fuente relacionado de JDK en Eclipse
Para tener una comprensión más profunda de la implementación de los algoritmos de cifrado unidireccionales MD5 y SHA en Java, el código fuente del JDK puede asociarse con el uso del IDE Eclipse (el autor usa JDK6.0).
Después de completar la instalación de JDK6.0, está el directorio Src.Zip en el directorio raíz de JDK (por ejemplo, C: /Java/JDK1.6.0_21). Este directorio puede descomprimirse a otro directorio (por ejemplo, D:/Amigo/Estudio/Ensayo Técnico/201405). SRC.ZIP no contiene todo el código fuente JDK. Por ejemplo, los subpackages bajo Sun no existen en Src.zip (por ejemplo, el paquete de seguridad del sol y sus subpackages utilizados en este artículo no están incluidos).
Para descargar estos subpackages, debe descargar el código fuente de OpenJDK. OpenJDK es la versión de código abierto de JDK y se lanza en forma de protocolo GPL. En JDK7, OpenJDK se había convertido en el desarrollo de la columna vertebral de JDK7. Sun JDK7 fue lanzado sobre la base de OpenJDK7. La mayoría de sus códigos originales son los mismos, y solo se reemplazó una pequeña parte de los códigos originales. Publicado usando JRL (Licencia de Javaresearch, Acuerdo de Licencia de Investigación Java).
OpenJDK Descargar dirección: //www.vevb.com/softs/75724.html
Después de descargar, copie todos los archivos y carpetas en el directorio OpenJDK-6-SRC-B27-26_OCT_2012/JDK/SRC/SRC/Classes del directorio SRC descomprimido en el directorio SRC descomprimido.
A continuación, configure el código fuente asociado en Eclipse: haga clic en "Windows"-> "Preferencias" y seleccione "Java"-> "JRES instalado" en el menú izquierdo. Si se ha configurado el JRE de esta máquina, no necesita configurarla. Si no está configurado, haga clic en el botón "Agregar" a la derecha y seleccione la ruta del JDK6.0 instalado en la ventana emergente "Agregar JRE" (por ejemplo, c: /java/jdk1.6.0_21). Haga clic en el botón "Aceptar" para completar la configuración de JRE.
Seleccione el JRE SET, haga clic en el botón "Editar ..." a la derecha, seleccione el paquete RT.JAR en la ventana emergente, haga clic en el botón "Ajuste de origen ...", haga clic en el botón "Carpeta externa ..." en la ventana emergente y apunte la ruta del código fuente a la ruta del SRC solo (EG. D:/Amigo/Estudio/Esseo técnico/201405). Vea la figura a continuación:
Después de hacer clic en el botón "Aceptar" para configurarlo, al escribir la implementación de MD5 y SHA, al llamar a los métodos relevantes de MessageDigest, puede usar la depuración de depuración F5 de un solo paso para ver las clases principalmente involucradas en la implementación de algorits de cifrado One-Way SHA en Java.
1.3 Las principales clases de cifrado MD5 y SHA en JDK
En JDK6.0, los diagramas de clases de varias clases estrechamente relacionados con MD5 y SHA son los siguientes:
Entre ellos, "MessageDigestspi" es la clase abstracta de nivel superior, y "MessageDigest" y "DigestBase" en el mismo paquete son clases de subtracción.
En el diagrama de clase anterior, se utiliza el patrón de diseño delegado. El principio de este patrón es que la clase B (aquí es la clase interna delegage) y la clase A (aquí está la clase Messagedigestspi) son dos clases que no tienen relación entre sí. B tiene exactamente los mismos métodos y atributos que a; Y llamar a los métodos y atributos en B es llamar métodos y atributos con el mismo nombre en A. B parece ser un intermediario autorizado por A. El código de terceros no necesita saber la existencia de A y sus subclases, ni necesita tener una conexión directa con A y sus subclases. A través de B, las funciones de A se pueden usar directamente, lo que no solo puede usar varias funciones de A, sino también proteger bien a A y sus subclases.
Los códigos relevantes para MD5 y SHA están todos en clases como MD5 y SHA, pero la clase abstracta MessageGest orientada al cliente no necesita lidiar con varias clases de implementación, simplemente lidiar con ellas a través de la clase delegada.
2. Cifrado MD5
2.1 Descripción general
Algoritmo de digestión de mensajes MD5 (el nombre chino es el algoritmo de digestión de mensajes Fifth Edition) es una función hash ampliamente utilizada en el campo de seguridad informática para proporcionar protección de integridad de mensajes. El número de archivo de este algoritmo es RFC 1321 (R.Rivest, MIT Laboratory for Computer Science y RSA Data Security Inc. Abril de 1992).
El nombre completo de MD5 es el algoritmo 5 de mensajes-digest 5 (algoritmo de abstracto de información), desarrollado por Ronald L. Rivest del Laboratorio MIT para Ciencias de la Computación y RSA Data Security Inc a principios de la década de 1990, y desarrollado por MD2, MD3 y MD4.
MD5 se utiliza para garantizar una transmisión de información completa y consistente. Es uno de los algoritmos hash ampliamente utilizados por las computadoras (también traducidas como algoritmo abstracto y algoritmo hash). Los lenguajes de programación convencionales son generalmente implementados por MD5. Calcular datos (como los caracteres chinos) en otro valor de longitud fija es el principio básico del algoritmo hash. Los predecesores de MD5 fueron MD2, MD3 y MD4.
La función de MD5 es permitir que la información de gran capacidad se "comprime" en un formato confidencial antes de firmar una clave privada con software de firma digital (es decir, convertir una cadena de bytes de cualquier longitud en una cadena hexadecimal de una cierta longitud).
2.2 Principios de algoritmo
Una breve descripción del algoritmo MD5 puede ser la siguiente: MD5 procesa la información de entrada en paquetes de 512 bits, y cada paquete se divide en 16 subpackets de 32 bits. Después de una serie de procesamiento, la salida del algoritmo consta de cuatro paquetes de 32 bits. Después de cascada estos cuatro paquetes de 32 bits, se generará un valor hash de 128 bits.
En el algoritmo MD5, la información debe llenarse primero, de modo que el resultado del equilibrio restante de su par de longitud de bits 512 es igual a 448. Por lo tanto, la longitud de bit de la información se extenderá a N*512+448, N es un entero no negativo, y N puede ser cero. El método de llenado es el siguiente: llene un 1 e innumerable 0s detrás de la información y deje de llenar la información con 0 hasta que se cumplan las condiciones anteriores. Luego, se adjunta una longitud de información de relleno superior en binario de 64 bits. Después de estos dos pasos de procesamiento, la longitud de bit de la información = N*512+448+64 = (n+1)*512, es decir, la longitud es exactamente un múltiplo entero de 512. La razón de esto es cumplir con los requisitos para la longitud de la información en el procesamiento posterior.
Implementación de 2.3 MD5 en Java
La implementación de Java del algoritmo de cifrado MD5 es la siguiente:
paquete amigo.endecrypt; import java.security.messagedigest;/*** Usar cifrado md5* @author xingxing, xie* @datetime 2014-5-31*/public Código*/ public static String MD5Encode (String Instr) lanza la excepción {MessageDigest md5 = null; intente {md5 = MessageDigest.getInstance ("MD5"); } catch (Exception e) {System.out.println (e.ToString ()); E.PrintStackTrace (); devolver ""; } byte [] byteArray = instr.getBytes ("utf-8"); byte [] md5bytes = md5.digest (bytearray); StringBuffer hexValue = new StringBuffer (); for (int i = 0; i <md5bytes.length; i ++) {int val = ((int) md5bytes [i]) & 0xff; if (val <16) {hexValue.append ("0"); } hexValue.append (integer.tohexstring (val)); } return hexValue.ToString (); } / ** * prueba la función principal * @param args * @throws excepción * / public static void main (string args []) lanza la excepción {string str = new String ("AmigoxiexiExingXing"); System.out.println ("original:" + str); System.out.println ("MD5:" + MD5Encode (Str)); }}Resultados de la prueba:
Original: Amigoxiexiexingxing
Post-MD5: E9AC094091B96B84CCA48098BC21B1D6
3. Cifrado SHA
3.1 Descripción general
SHA es un algoritmo de cifrado de datos. Este algoritmo ha sido desarrollado y mejorado por expertos en cifrado a lo largo de los años y se ha vuelto cada vez más perfecto. Ahora se ha convertido en uno de los algoritmos de hash más seguros reconocidos y se ha utilizado ampliamente. La idea de este algoritmo es recibir un texto plano y luego convertirlo en un texto de cifrado (generalmente más pequeño) de una manera irreversible. También se puede entender simplemente como el proceso de tomar una cadena de códigos de entrada (llamados premaptos o información) y convertirlos en una secuencia de salida de dígitos fijos de longitud más corta, es decir, valores hash (también conocidos como código de autenticación de digestiones de información o de autenticación de información). Se puede decir que el valor de la función hash es una especie de "huella digital" o "resumen" del texto sin formato, por lo que la firma digital del valor hash puede considerarse como la firma digital del texto sin formato.
El algoritmo de hash seguro (SHA) es el National Standard FIPS Pub 180 publicado por el Instituto Nacional de Normas y Tecnología. El último estándar se ha actualizado a FIPS PUB 180-3 en 2008. Entre ellos, se especifican varios algoritmos de hashing unidireccionales como SHA-1, SHA-224, SHA-256, SHA-384 y SHA-512. SHA-1, SHA-224 y SHA-256 son adecuados para mensajes con una longitud de no más de 2^64 bits binarios. SHA-384 y SHA-512 son adecuados para mensajes con una longitud de no más de 2^128 bits binarios.
3.2 Principio
SHA-1 es un algoritmo de cifrado de datos. La idea de este algoritmo es recibir un texto plano y luego convertirlo en un texto de cifrado (generalmente más pequeño) de una manera irreversible. También se puede entender simplemente como el proceso de tomar una cadena de códigos de entrada (llamados premaptos o información) y convertirlos en una secuencia de salida de dígitos fijos de longitud más corta, es decir, valores hash (también conocidos como código de autenticación de digestiones de información o de autenticación de información).
La seguridad de una función hash unidireccional se encuentra en la fuerte naturaleza unidireccional de su proceso de operación para generar valores hash. Si una contraseña está integrada en la secuencia de entrada, nadie puede generar el valor hash correcto sin conocer la contraseña, asegurando así su seguridad. SHA bloquea las secuencias de entrada en 512 bits (64 bytes) por bloque y produce 20 bytes de salida llamados Código de autenticación de información o resumen de información.
La longitud de los paquetes de entrada de este algoritmo es ilimitado, y la salida generada es un resumen de mensajes de 160 bits. La entrada se procesa en paquetes de 512 bits. SHA-1 es irreversible, a prueba de conflictos y tiene un buen efecto de avalancha.
La firma digital se puede implementar a través de un algoritmo hash. El principio de la firma digital es convertir el texto plano que se transmitirá en un digest de mensajes a través de una operación de función (hash) (diferentes textos simples corresponden a diferentes digestiones de mensajes). El Mensaje Digest está encriptado y enviado al destinatario junto con el texto sin formato. El destinatario genera un nuevo Mensaje Digest para descifrar y compara el Digest del mensaje del remitente. El resultado de la comparación es consistente, lo que significa que el texto plano no ha cambiado. Si es inconsistente, significa que el texto sin formato ha sido manipulado.
Mac (código de autenticación de información) es un resultado hash, en el que parte de la información de entrada es una contraseña. Solo los participantes que saben esta contraseña pueden calcular y verificar la legitimidad del código Mac nuevamente.
3.3 Implementación de SHA en Java
La implementación de Java de SHA es similar a MD5, y el código de referencia es el siguiente:
paquete amigo.endecrypt; import java.security.messageGest;/*** use shaa cifrado* @author xingxing, xie* @datetime 2014-6-1*/public class shautil {/**** SHA Cifryption genera 40 bits bits* @param cadader para ser encadenado para ser encadenado de 40 bits de 40 bits. Shaencode (String Instr) lanza la excepción {MessageDigest sha = null; intente {sha = MessageDigest.getInstance ("Sha"); } catch (Exception e) {System.out.println (e.ToString ()); E.PrintStackTrace (); devolver ""; } byte [] byteArray = instr.getBytes ("utf-8"); byte [] md5bytes = sha.digest (bytearray); StringBuffer hexValue = new StringBuffer (); for (int i = 0; i <md5bytes.length; i ++) {int val = ((int) md5bytes [i]) & 0xff; if (val <16) {hexValue.append ("0"); } hexValue.append (integer.tohexstring (val)); } return hexValue.ToString (); } / ** * prueba la función principal * @param args * @throws excepción * / public static void main (string args []) lanza la excepción {string str = new String ("AmigoxiexiExingXing"); System.out.println ("original:" + str); System.out.println ("Sha:" + Shaencode (Str)); }}Los resultados de la prueba son los siguientes:
Original: Amigoxiexiexingxing
Después de SHA: 04F79F496DD6BDAB3439511606528A4AD9CAAC5E
3. Comparación entre SHA-1 y MD5
Debido a que ambos se derivan de MD4, SHA-1 y MD5 son muy similares entre sí. En consecuencia, su fuerza y otras características son similares, pero también hay diferencias en los siguientes puntos:
1) Seguridad contra los ataques forzados: la diferencia más significativa e importante es que el digest de SHA-1 es 32 bits más largo que el Digest MD5. Utilizando la tecnología forzada, la dificultad de generar cualquier mensaje para que su resumen sea igual a un resumen dado es una operación del orden de 2^128 para MD5 y una operación de 2^160 para SHA-1. De esta manera, SHA-1 tiene mayor fuerza para ataques por la fuerza.
2) Seguridad del análisis de contraseña: debido al diseño de MD5, es vulnerable al análisis de contraseña, y SHA-1 parece ser menos susceptible a tales ataques.
3) Velocidad: en el mismo hardware, Sha-1 funciona lentamente que MD5.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.