Dado que las solicitudes http no tienen estado, no sabemos quién es el solicitante. Así nació la firma: el receptor y el solicitante negociaron un método de firma para la verificación para ganar confianza mutua y llevar a cabo el siguiente paso del intercambio de lógica empresarial.
Entre ellas, las firmas más utilizadas son la clave pública y la clave privada, utilizando la clave privada para firmar, la clave pública para verificar la firma o la clave pública para cifrar y la clave privada para descifrar.
Independientemente de si es una clave pública o privada, primero debemos formatearla, por supuesto, si obtienes la clave formateada, puedes ignorar este paso.
1. Formateo de claves públicas y privadas.
********************私钥格式化********************/
function formatPriKey($priKey) {
$fKey = "-----BEGIN PRIVATE KEY-----\n";
$len = strlen($priKey);
for($i = 0; $i < $len; ) {
$fKey = $fKey . substr($priKey, $i, 64) . "\n";
$i += 64;
}
$fKey .= "-----END PRIVATE KEY-----";
return $fKey;
}
/********************公钥格式化********************/
function formatPubKey($pubKey) {
$fKey = "-----BEGIN PUBLIC KEY-----\n";
$len = strlen($pubKey);
for($i = 0; $i < $len; ) {
$fKey = $fKey . substr($pubKey, $i, 64) . "\n";
$i += 64;
}
$fKey .= "-----END PUBLIC KEY-----";
return $fKey;
}
Formatear significa agregar sufijos y sufijos y luego ajustar cada 64 bits. También puede formatear simplemente de la siguiente manera:
//私钥格式化
$fKey = "-----BEGIN PRIVATE KEY-----\n".chunk_split($public_key, 64,"\n").'-----END PRIVATE KEY-----';
//公钥格式化
$fKey = "-----BEGIN PUBLIC KEY-----\n".chunk_split($public_key, 64,"\n").'-----END PUBLIC KEY-----';
2. Verificación de firma de clave privada y firma de clave pública (SHA1withRSA)
/********************私钥签名********************/
function get_private_sign($sign_str,$private_key,$signature_alg=OPENSSL_ALGO_SHA1){
$private_key = openssl_pkey_get_private(private_key);//加载密钥
openssl_sign($sign_str,$signature,$private_key,$signature_alg);//生成签名
$signature = base64_encode($signature);
openssl_free_key($private_key);
return $signature;
}
/********************公钥验签********************/
function public_verify($sign_str,$sign,$public_key,$signature_alg=OPENSSL_ALGO_SHA1){
$public_key = openssl_get_publickey($public_key);
$verify = openssl_verify($sign_str, base64_decode($sign), $public_key, $signature_alg);
openssl_free_key($public_key);
return $verify==1;//false or true
}
$sign_str es la cadena de firma o cadena de verificación de firma, $sign es la firma y las claves pública y privada deben estar formateadas; de lo contrario, no serán reconocidas.
3. Cifrado de clave pública y descifrado de clave privada (SHA1conRSA)
/********************公钥加密********************/
function get_public_sign($sign_str,$public_key,$signature_alg=OPENSSL_ALGO_SHA1){
$public_key = openssl_pkey_get_public($public_key);//加载密钥
openssl_sign($sign_str,$signature,$public_key,$signature_alg);//生成签名
$signature = base64_encode($signature);
openssl_free_key($public);
return $signature;
}
/********************私钥解密********************/
function private_verify($sign_str,$sign,$private_key,$signature_alg=OPENSSL_ALGO_SHA1){
$private_key = openssl_get_privatekey($private_key);
$verify = openssl_verify($sign_str, base64_decode($sign), $private_key, $signature_alg);
openssl_free_key($private_key);
return $verify==1;//false or true
}
4. Cifrado y descifrado AES (AES/ECB/PKCS5Padding)
//aes加密
function encrypt($data, $key) {
$data = openssl_encrypt($data, 'aes-128-ecb', base64_decode($key), OPENSSL_RAW_DATA);
return base64_encode($data);
}
//aes解密
function decrypt($data, $key) {
$encrypted = base64_decode($data);
return openssl_decrypt($encrypted, 'aes-128-ecb', base64_decode($key), OPENSSL_RAW_DATA);
}