常见加密算法:
- 非对称加密算法: RSA、ECC、DH
- 对称加密算法:AES、DES、RC4
- hash算法:MD5、SHA1、SHA256
加密与签名
- 私钥签名, 公钥验签
- 公钥加密, 私钥解密
openssl genrsa -out key.pem 1024 #生成pem格式私钥openssl rsa -in key.pem -pubout -out pubkey.pem #提取pem格式公钥(-----BEGIN PUBLIC KEY----------BEGIN PUBLIC KEY-----)openssl rsa -in key.pem -RSAPublicKey_out -out pubkey.pem #提取pem RSAPublicKey格式公钥(-----BEGIN RSA PUBLIC KEY-----)openssl rsautl -encrypt -in input.file -inkey pubkey.pem -pubin -out output.file #公钥加密文件openssl rsautl -decrypt -in input.file -inkey key.pem -out output.file #私钥解密文件
MD5withRSA签名 :
- 生成签名
- 对数据MD5取摘要
- 对摘要进行RSA私钥加密获得签名
- 签名校验
- RSA公钥解密接收到的签名获得原始MD5摘要
- 对接收到的数据直接MD5取摘要
- 校验两个摘要值
/***************************** MD5withRSA非对称加密下的签名/校验 PHP示例 *****************************/ /** * 生成签名 * @param $pri_key_path 私钥地址 或 内容 * @param $signature_alg 签名算法常量, 如OPENSSL_ALGO_SHA1、OPENSSL_ALGO_MD5 * @param $content 需要签名的内容 */ public function rsaSign($pri_key_path, $signature_alg, $content) { $res = openssl_pkey_get_private($pri_key_path); openssl_sign($content, $sign, $res, $signature_alg); openssl_free_key($res); $sign = base64_encode($sign); # 对签名base64加密,避免其中的非ASCII字符在传输中丢失 return $sign; } /** * 验证签名 * @param $pub_key_path 公钥地址 或 内容 * @param $signature_alg 签名算法常量, 如OPENSSL_ALGO_SHA1、OPENSSL_ALGO_MD5 * @param $content 签名的内容 * @param $sign 签名 */ public function rsaVerifySign($pub_key_path, $signature_alg, $content, $sign) { $sign = base64_decode($sign); $res = openssl_pkey_get_public($pub_key_path); $ret = openssl_verify($content, $sign, $res, $signature_alg); openssl_free_key($res); return $ret == 1; }
java-php加密通信
- php直接基于openssl秘钥来进行加密处理
- java一般会对openssl秘钥去头去尾合并单行处理
- java加密php解密时,java的cipher必须使用RSA/ECB/PCKS1Padding,不能是RSA
- java秘钥转php秘钥格式
function translateJavakey2Phpkey($javaKeyStr, $isPublicKey){ $keyContent = trim(chunk_split(str_replace(["\r","\n"], '', $javaKeyStr), 64, "\n")); return $isPublicKey ? printf("-----BEGIN PUBLIC KEY-----\n%s\n-----END PUBLIC KEY-----\n", $keyContent); : printf("-----BEGIN PRIVATE KEY-----\n%s\n-----END PRIVATE KEY-----\n", $keyContent); }
SSH-KEY生成
# 生成RSA加密类型的秘钥,导出两个文件:# 公钥 ~/.ssh/id_rsa.pub# 私钥 ~/.ssh/id_rsassh-keygen -t rsa -C "邮箱" -b 4096