Cifrado de front-end

 

1.1 Descripción general del cifrado js de front-end

Los requisitos de seguridad del sistema son relativamente altos, por lo que debe elegir el protocolo https para transmitir datos. Por supuesto, en muchos casos, el sitio web general, si los requisitos de seguridad no son muy altos, se puede utilizar el protocolo http. En este caso, la transmisión de texto sin formato de la contraseña es obviamente inapropiada, porque si la solicitud es interceptada durante la transmisión, puede iniciar sesión en el sitio web directamente con la contraseña de texto sin formato. 
HTTPS (443) agrega el protocolo SSL (Secure Sockets Layer) a HTTP (80). SSL se basa en certificados para verificar la identidad del servidor y encripta la comunicación entre el navegador y el servidor. Antes de la transmisión, use la clave pública para encriptar, y el lado del servidor usa la clave privada para desencriptar.

Para el cifrado del front-end web que usa el protocolo http, solo puede prevenir al caballero pero no al villano. La interfaz está completamente expuesta, incluido su algoritmo de cifrado
Conociendo el algoritmo de cifrado, la contraseña se puede descifrar, es solo cuestión de tiempo. Consulte un artículo sobre Zhihu: Lucha contra las bibliotecas drag

Por lo tanto, el cifrado es aumentar el costo del tiempo de craqueo. Si el tiempo requerido para el craqueo es inaceptable, esto logrará el objetivo .

Para garantizar que las contraseñas almacenadas en la base de datos sean más seguras, es necesario combinar una variedad de métodos de cifrado unidireccionales (asimétricos) en el back-end para el almacenamiento cifrado.

El back-end de cifrado de front-end debe ser descifrado, por lo que se requiere un algoritmo de cifrado simétrico, es decir, el front-end utiliza cifrado = cifrado (contraseña + clave), y el back-end utiliza contraseña = descifrado (cifrado + clave). El front-end solo transmite la cadena cifrada cifrada con la contraseña y la clave. De esta manera, incluso si se intercepta la solicitud, se conoce el algoritmo de cifrado, pero es difícil descifrar la contraseña de texto plano debido a la falta de clave. Entonces esta clave es muy importante. Y esta clave es generada y destruida por el control de back-end, y deja de ser válida cuando se agota, por lo que incluso si la contraseña cifrada se puede usar para enviar una solicitud de inicio de sesión simulada, pero la clave ha expirado, el back-end no se puede verificar.

Tenga en cuenta que si el entorno local es intrínsecamente inseguro y se conoce la clave , el algoritmo de descifrado puede descifrar la contraseña en un instante. Aquí simplemente se asume que la situación fue interceptada durante la transmisión. Por lo tanto, el cifrado de front-end no puede prevenir a los villanos . Si realmente desea evitarlo, puede comprimir y cifrar el archivo js del algoritmo de cifrado y actualizar constantemente el método para hacer que el archivo js sea difícil de obtener, lo que dificulta a los piratas informáticos obtener el algoritmo de cifrado. Así es como lo hace el pervertido Google: implementa una máquina virtual js por sí mismo y dificulta la obtención de algoritmos de cifrado al actualizar constantemente los archivos js cifrados y ofuscados. De esta forma, los piratas informáticos no pueden descifrar sin conocer el algoritmo de cifrado.

Aquí, el servidor genera la clave cuando la página se carga y se guarda en un campo oculto.

1.2.3 Cifrado y descifrado del lado de Java (PKCS5Padding es consistente con Pkcs7 de js)

package com.jykj.demo.util;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

import sun.misc.BASE64Decoder;

public class EncryptUtil {
    private static final String KEY = "abcdefgabcdefg12";  
    private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";  
    public static String base64Encode(byte[] bytes){  
        return Base64.encodeBase64String(bytes);  
    }  
    public static byte[] base64Decode(String base64Code) throws Exception{  
        return new BASE64Decoder().decodeBuffer(base64Code);  
    }  
    public static byte[] aesEncryptToBytes(String content, String encryptKey) throws Exception {  
        KeyGenerator kgen = KeyGenerator.getInstance("AES");  
        kgen.init(128);  
        Cipher cipher = Cipher.getInstance(ALGORITHMSTR);  
        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));  

        return cipher.doFinal(content.getBytes("utf-8"));  
    }  
    public static String aesEncrypt(String content, String encryptKey) throws Exception {  
        return base64Encode(aesEncryptToBytes(content, encryptKey));  
    }  
    public static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throws Exception {  
        KeyGenerator kgen = KeyGenerator.getInstance("AES");  
        kgen.init(128);  

        Cipher cipher = Cipher.getInstance(ALGORITHMSTR);  
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));  
        byte[] decryptBytes = cipher.doFinal(encryptBytes);  

        return new String(decryptBytes);  
    }  
    public static String aesDecrypt(String encryptStr, String decryptKey) throws Exception {  
        return aesDecryptByBytes(base64Decode(encryptStr), decryptKey);  
    }  


    /**
     * 测试
     * 
     */
    public static void main(String[] args) throws Exception {

        String content = "Test String么么哒";  //0gqIDaFNAAmwvv3tKsFOFf9P9m/6MWlmtB8SspgxqpWKYnELb/lXkyXm7P4sMf3e
        System.out.println("加密前:" + content);  

        System.out.println("加密密钥和解密密钥:" + KEY);  

        String encrypt = aesEncrypt(content, KEY);  
        System.out.println(encrypt.length()+":加密后:" + encrypt);  

        String decrypt = aesDecrypt(encrypt, KEY);  
        System.out.println("解密后:" + decrypt);  
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_43422918/article/details/114926663
Recomendado
Clasificación