Análisis de cifrado MD5

El concepto de encriptación MD5

El cifrado MD5 es un algoritmo de resumen de información de uso común, utilizado principalmente para garantizar la coherencia de los datos y la verificación de firmas, es un algoritmo de cifrado irreversible.

El cifrado MD5 es para cifrar cualquier conjunto de bytes en 32 bytes de datos, y luego se representan como números hexadecimales de 32 bits en forma.

Uso simple de encriptación MD5

Echemos un vistazo a la sencilla aplicación de cifrado MD5 en Java.

Java nos ha ayudado a lograr el cifrado MD5, solo necesitamos llamar a la función del sistema para lograrlo. La secuencia de llamada es la siguiente:

Primer paso

Obtenga objetos cifrados MD5:

try {
    messagedigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException nsaex) {
    System.err.println(MD5Util.class.getName() + "初始化失败,MessageDigest不支持MD5Util。");
    nsaex.printStackTrace();
}
Segundo paso

Datos entrantes a cifrar:

byte[] secretBytes = messagedigest.digest(str.getBytes());

Los datos cifrados también se pueden transferir en lotes:

InputStream fis;
fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int numRead = 0;
while ((numRead = fis.read(buffer)) > 0) {
    messagedigest.update(buffer, 0, numRead);
}
fis.close();
byte[] secretBytes = messagedigest.digest();

La matriz de bytes devuelta es una matriz de longitud 16.

El tercer paso

Convierta el conjunto de bytes cifrados al cifrado MD5 que generalmente vemos:

protected static char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};


private static String bufferToHex(byte bytes[], int m, int n) {
    StringBuffer stringbuffer = new StringBuffer(2 * n);
    int k = m + n;
    for (int l = m; l < k; l++) {
        appendHexPair(bytes[l], stringbuffer);
    }
    return stringbuffer.toString();
}

private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
    char c0 = hexDigits[(bt & 0xf0) >>> 4];// 取字节中高 4 位的数字转换
    char c1 = hexDigits[bt & 0xf];// 取字节中低 4 位的数字转换
    stringbuffer.append(c0);
    stringbuffer.append(c1);
}

De esta forma, se obtiene la cadena encriptada.

Tenga en cuenta que generalmente vemos otra forma de convertir el byte en una cadena encriptada, que es usar la clase BigInteger:

String md5code = new BigInteger(1, secretBytes).toString(16);

Pero hay un problema con esta forma de escritura, es decir, si el dígito más alto de la cadena después del cifrado es 0, se omitirá:

String str = new BigInteger(1, new byte[]{0, 16}).toString(16);
System.out.println(str);
//输出10

Entonces, la forma correcta de usar BigInteger es la siguiente:

String md5code = new BigInteger(1, secretBytes).toString(16);
for (int i = 0; i < 32 - md5code.length(); i++) {
    md5code = "0" + md5code;
}

Lo anterior es una implementación simple de MD5 en Java.

Escenarios prácticos de encriptación MD5

Echemos un vistazo a los escenarios de aplicación del cifrado MD5.

Dado que MD5 es irreversible, no es adecuado para alguna transmisión cifrada y luego descifrada en el otro extremo. Se utiliza principalmente para ocultar información y garantizar la coherencia de los datos.

A continuación, presentamos algunos escenarios específicos que utilizan el cifrado MD5.

Contraseña de usuario

La contraseña del usuario son datos muy confidenciales. Cuando se transmite o almacena, si se usa directamente en texto plano, causará riesgos de seguridad ocultos.

Por ejemplo, el texto sin formato existe localmente en el cliente. Después de que el cliente es descifrado por la raíz, el archivo se puede obtener directamente para encontrar la contraseña. La contraseña en la base de datos del servidor también tiene el riesgo de obtener la contraseña después de que el servidor está descifrado, y el personal de administración de fondo puede ver la contraseña. En el curso de la transmisión, si se produce un secuestro de DNS, también se puede obtener la contraseña.

Por lo tanto, si la contraseña se transmite y almacena, es mejor usar el cifrado MD5. El cliente y el servidor comparan las cadenas cifradas y, si coinciden, se verifica la contraseña.

Firma de la interfaz

Si la interfaz de red no está restringida, cualquiera de las partes puede llamar a la interfaz e implementar algunos servicios, lo que traerá grandes riesgos de seguridad. Para evitar esta situación, puede optar por agregar un parámetro de firma a la interfaz.

Por ejemplo, para la interfaz de red https://wanandroid.com/wxarticle/chapters/json, si agrega otro signo de parámetro de firma, su valor será "ser feliz" + ruta completa MD5 firmada, y luego se recibe en segundo plano Después de la solicitud, verifique la firma para evitar llamadas maliciosas de terceros.

Comprobación de coherencia de archivo

El archivo está dañado durante el proceso de transmisión. MD5 se puede utilizar para verificar la consistencia del archivo.

Por ejemplo, cuando el cliente descarga un archivo grande, generalmente se usa un mecanismo de continuación de punto de interrupción, luego se requiere un escenario: después de descargar una parte del archivo, la descarga finaliza y luego el archivo del servidor se actualiza durante este período. Cuando el cliente descarga aquí, el archivo descargado es problemático, por lo que se producirá un error si no se realiza la verificación, y si el servidor envía un archivo, también envía un valor MD5, y el cliente descarga Después de verificar el valor MD5 del archivo descargado y el valor MD5 emitido por el servidor, elimine el archivo y descárguelo nuevamente para evitar esta situación.

Seguridad y descifrado del cifrado MD5

Tomando las contraseñas cifradas como ejemplo, dado que el cifrado MD5 es irreversible y la similitud entre las cadenas cifradas no está relacionada con la cadena original, la cadena original no se puede corregir comparando la familiaridad de la cadena cifrada, por lo que el descifrado de MD5 es generalmente Se basa en el craqueo por fuerza bruta, y el resultado del cifrado MD5 es de 16 a 32 poderes. Si quiere romper por fuerza bruta una cantidad tan grande de datos, la computadora actual no puede hacerlo, por lo que la seguridad del MD5 es muy alta en el sentido convencional.

Entonces, ¿cómo es el descifrado de contraseñas MD5 ahora popular en el mercado? Esto se debe a que las contraseñas establecidas por la mayoría de las personas son relativamente simples, generalmente números puros o números en inglés más números, etc. Puede reducir muchos cálculos, a fin de lograr el propósito de agrietamiento.

Para combatir esta situación y proteger la información de la contraseña del usuario, puede agregar algunos prefijos y sufijos comunes a la contraseña del usuario. Por ejemplo, el usuario establece la contraseña en 123456. Si se obtiene la cadena encriptada, la biblioteca la golpeará fácilmente. Agrietarse, pero agregamos manualmente el prefijo y el sufijo, use abc123456xyz , por lo que la probabilidad de agrietamiento será mucho menor.

Publicado 19 artículos originales · elogiado 8 · visitas 4041

Supongo que te gusta

Origin blog.csdn.net/u014068277/article/details/103115288
Recomendado
Clasificación