php中用openssl_pkey_new()生成2048位及以上rsa密钥对,导出pem格式公私钥(私钥建议密码加密);公钥加密、私钥解密适用于小数据,超长内容需混合加密;私钥签名、公钥验签需指定相同哈希算法(如sha256)。

生成RSA公私钥对
PHP中用openssl_pkey_new()生成密钥对,推荐2048位或以上保证安全性。生成后需分别导出公钥(PEM格式)和私钥(PEM格式),私钥建议加密存储(如用密码保护)。
关键步骤:
- 调用openssl_pkey_new(['private_key_bits' => 2048])获取资源句柄
- 用openssl_pkey_get_details()提取公钥信息,或直接用openssl_pkey_get_public()导出公钥字符串
- 用openssl_pkey_export()将私钥保存为字符串(可选$passphrase参数加密)
- 公钥通常以
-----BEGIN PUBLIC KEY-----开头,私钥以-----BEGIN PRIVATE KEY-----(PKCS#8)或-----BEGIN RSA PRIVATE KEY-----(PKCS#1)开头,注意格式兼容性
使用公钥加密、私钥解密
RSA加密仅适用于小数据(比如加密一个AES会话密钥),明文长度不能超过密钥长度减去填充开销(如PKCS#1 v1.5约减11字节,OAEP更长)。超长内容应先用对称加密,再用RSA加密对称密钥。
操作要点:
- 加密:用openssl_public_encrypt($data, $crypted, $public_key),成功返回true,密文存入$crypted
- 解密:用openssl_private_decrypt($crypted, $decrypted, $private_key, $padding),常用OPENSSL_PKCS1_OAEP_PADDING(更安全)或OPENSSL_PKCS1_PADDING
- 注意:加密/解密函数返回布尔值,失败时需检查openssl_error_string()获取错误原因
- 密文是二进制数据,传输或存储前建议base64_encode();解密前对应base64_decode()
使用私钥签名、公钥验签
签名不是加密,而是对原始数据的摘要进行私钥运算,用于身份认证与完整性校验。PHP支持多种哈希算法(如sha256),推荐与签名一起显式指定。
典型流程:
- 签名:用openssl_sign($data, $signature, $private_key, OPENSSL_ALGO_SHA256),生成的$signature是二进制
- 验签:用openssl_verify($data, $signature, $public_key, OPENSSL_ALGO_SHA256),返回1(通过)、0(失败)或-1(错误)
- 签名和验签必须使用相同摘要算法,否则必然失败
- 签名数据本身不包含原文,需额外传输或存储原文;验签时必须用完全相同的原文参与计算
实用注意事项
RSA在PHP中依赖OpenSSL扩展,确保已启用(extension=openssl)。生产环境避免硬编码密钥,建议从文件或密钥管理服务加载。
常见陷阱提醒:
- 公钥字符串若含换行符或空格,需str_replace(["\r","\n"," "], '', $key)清理后再传入函数
- 私钥含密码时,解密操作需先用openssl_pkey_get_private($key, $pass)加载,再传入加解密/签名函数
- 不要用RSA直接加密用户密码或长文本——性能差且不安全;应结合哈希(密码)或混合加密(长数据)
- 验签失败常见原因是原文被自动trim()、编码不一致(如UTF-8 BOM)、或签名未正确base64_decode()
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











