English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En el proyecto, hay una sección que requiere encriptar el ID del usuario, transmitirlo al siguiente punto y desencriptarlo. (Perdón por no poder revelar demasiado)-_-!),lo primero que se piensa es una función de Consonance Ucenter, luego se buscan y se encuentran métodos simples en la magia breve, se integran y se forman las funciones que se utilizan.
Primero, la encriptación simétrica
El remitente encripta el texto claro utilizando la clave y el algoritmo para enviar el texto cifrado, y el destinatario utiliza la clave y el algoritmo para procesar el texto cifrado en texto claro, y ambos lados utilizan la misma clave para encriptar y desencriptar los datos.
Dado que se utiliza la misma clave para encriptar y desencriptar, la seguridad no solo depende del algoritmo, sino también de la seguridad de la clave.
Claro, no es que cuanto más compleja sea la clave, mejor, por el contrario, las claves suelen ser más pequeñas, porque aunque una clave más grande hace que la encriptación sea más fuerte, el proceso de encriptación y desencriptación es más lento, por lo que el tamaño de la clave debe tener en cuenta tanto la seguridad como la eficiencia.
Después de todo, las características del algoritmo de encriptación simétrica son que el algoritmo es público, la cantidad de cálculos es pequeña, la velocidad de encriptación es rápida y la eficiencia es alta. Sin la ventaja de la alta eficiencia, es mejor usar la encriptación asimétrica directamente.
Además, cada par de usuarios necesita usar una clave única que otros no conozcan cada vez que utilice el algoritmo de encriptación simétrica, lo que hace que el número de claves que poseen los remitentes y destinatarios crezca exponencialmente, convirtiendo la gestión de claves en una carga para los usuarios.
Es difícil usar algoritmos de encriptación simétrica en sistemas de red distribuidos, principalmente porque la gestión de claves es difícil y los costos de uso son altos.
Segundo, la encriptación asimétrica
La encriptación asimétrica es relativamente más segura, ya que utiliza un par de claves, la clave pública y la clave privada, que se utilizan respectivamente para encriptar y desencriptar. La clave privada solo puede ser guardada de manera segura por una parte y no puede ser revelada, mientras que la clave pública puede enviársela a cualquier persona que lo solicite.
La encriptación asimétrica más común debería ser el sistema bancario y las plataformas de pago. Por ejemplo, cuando aplicamos a la interfaz de pago de Alipay o UnionPay, obtenemos una clave pública. Al realizar un pago en el comercio, se utiliza la clave pública para encriptar la información y enviarla a la plataforma, y la plataforma utiliza la clave para desencriptar tu información y realizar operaciones de pago, etc.
Aunque la encriptación asimétrica es muy segura, es muy lenta en comparación con la encriptación simétrica, por lo que generalmente usamos la encriptación simétrica para transmitir mensajes, pero la clave utilizada en la encriptación simétrica puede enviarse mediante el método de encriptación asimétrica. Recuerda, ¿te dimos un par de claves cuando aplicaste a la interfaz de pago?^.^
Tercero, el uso combinado
La encriptación simétrica es rápida y es mejor usarla para enviar grandes cantidades de datos. La encriptación asimétrica es lenta tanto en encriptación como en desencriptación, y solo es adecuada para encriptar pequeñas cantidades de datos, pero, la seguridad de la encriptación asimétrica es muy alta.
Evitar lo malo y destacar lo bueno: usar la clave pública de la encriptación asimétrica para encriptar la clave de la encriptación simétrica, luego enviarla, y el destinatario utiliza la clave privada para desencriptarla y obtener la clave de encriptación simétrica, luego ambas partes pueden usar la encriptación simétrica para comunicarse.
Los métodos utilizados en el proyecto no deben revelarse, aquí solo se mencionan dos ejemplos: el primero es de ucenter, y el segundo es lo que se vio en la magia breve.
需要注意的是,由于是base64算法,加密后的字符串有可能会出现 + \ ,如果是用在url中,是不友好的,可以在外部或改下方法,正则验证递归调取下。
/** * 字符串加密以及解密函数 * @param string $string 原文或者密文 * @param string $operation 操作(ENCODE | DECODE), 默认为 DECODE * @param string $key 密钥 * @param int $expiry 密文有效期, 加密时候有效, 单位 秒,0 为永久有效 * @return string 处理后的 原文或者 经过 base64_encode 处理后的密文 */ function _authcode ($string, $operation = 'DECODE', $key = 'Ruesin', $expiry = 0) { $ckey_length = 4; $key = md5($key); $keya = md5(substr($key, 0, 16)); $keyb = md5(substr($key, 16 16)); $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), - $ckey_length)) : ''; $cryptkey = $keya . md5($keya . $keyc); $key_length = strlen($cryptkey); $string = $operation == 'DECODE' ? base64_decode( substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string; $string_length = strlen($string); $result = ''; $box = range(0, 255); $rndkey = array(); for ($i = 0; $i <= 255; $i ++) { $rndkey[$i] = ord($cryptkey[$i % $key_length]); } for ($j = $i = 0; $i < 256; $i ++) { $j = ($j + $box[$i] + $rndkey[$i]) % 256; $tmp = $box[$i]; $box[$i] = $box[$j]; $box[$j] = $tmp; } for ($a = $j = $i = 0; $i < $string_length; $i ++) { $a = ($a + 1) % 256; $j = ($j + $box[$a]) % 256; $tmp = $box[$a]; $box[$a] = $box[$j]; $box[$j] = $tmp; $result .= chr(ord($string[$i]) ^ ($box[($box[$a) + $box[$j]) % 256]); } if ($operation == 'DECODE') { if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10 16) == substr(md5(substr($result, 26) . $keyb), 0; 16)) { return substr($result, 26); } else { return ''; } } else { return $keyc . str_replace('=', '', base64_encode($result)); } }
/********************************************************************* Nombre de la función: encrypt Función: encriptar o desencriptar cadenas de texto Uso: Encriptación: encrypt('cadena', 'E', 'nowamagic'); Desencriptación: encrypt('cadena encriptada', 'D', 'nowamagic'); Descripción de los parámetros: $string :cadena que necesita ser encriptada o desencriptada $operation: determinar si es encriptación o desencriptación: E: encriptación D: desencriptación $key :llave de encriptación (clave); *********************************************************************/ function encrypt($string,$operation,$key='') { $key=md5($key); $key_length=strlen($key); $string=$operation=='D'?base64_decode($string):substr(md5($string.$key),0;8).$string; $string_length=strlen($string); $rndkey=$box=array(); $result=''; for($i=0;$i<=255;++) { $rndkey[$i]=ord($key[$i%$key_length]); $box[$i]=$i; } for($j=$i=0;$i<256;++) { $j=($j+$box[$i]+$rndkey[$i])%256; $tmp=$box[$i]; $box[$i]=$box[$j]; $box[$j]=$tmp; } for($a=$j=$i=0;$i<++) { $a=($a+1)%256; $j=($j+$box[$a])%256; $tmp=$box[$a]; $box[$a]=$box[$j]; $box[$j]=$tmp; $result.=chr(ord($string[$i])^($box[($box[$a+$box[$j])%256]); } if($operation=='D') { if(substr($result,0,85(substr($result,8).$key),0,8 { return substr($result,8); } else { return''; } } else { return str_replace('=','',base64_encode($result)); } }
Esto es todo el contenido de este artículo, espero que sea útil para su aprendizaje y que todos nos apoyen en el tutorial de alarido.
Declaración: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha contribuido y subido por los usuarios de Internet de manera autónoma. Este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume responsabilidad alguna por las responsabilidades legales. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.