PHP的openssl加密

PHP的openssl扩展

openssl扩展使用openssl加密扩展包,封装了多个用于加密解密相关的PHP函数,极大地方便了对数据的加密解密。 常用的函数有:

对称加密相关:

string openssl_encrypt(string $data , string $method , string $password[, $options, $iv])

其中$data为其要加密的数据,$method是加密要使用的方法,$password是要使用的密匙,函数返回加密后的数据;

其中$method列表可以使用openssl_get_cipher_methods()来获取,我们选取其中一个使用,常用加密模式有:DES-ECB、DES-CBC、DES-CTR、DES-OFB、DES-CFB。

$options 数据格式选项(可选)【选项有:】

  • 0
  • OPENSSL_RAW_DATA=1
  • OPENSSL_ZERO_PADDING=2
  • OPENSSL_NO_PADDING=3

$iv 密初始化向量(可选)

注:数据格式为 OPENSSL_RAW_DATA 或 OPENSSL_NO_PADDING 时,加密结果会有乱码,需要使用base64_encode编码

解密方法:

string openssl_decrypt(string $data , string $method , string $password[, $options, $iv])

使用方法与加密相同,只是$data为 要解密的数据

对称加密相关:

openssl_get_publickey();openssl_pkey_get_public(); // 从证书导出公匙;

openssl_get_privatekey();openssl_pkey_get_private(); // 从证书导出私匙;

以上函数传入证书文件(一般是.pem文件 或 密钥字符串),可用返回资源id Resource id  ,不可用返回false 。所有可以用来判断密钥是否是可用的

传入字符串,如

$public_key = '-----BEGIN PUBLIC KEY-----  
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3//sR2tXw0wrC2DySx8vNGlqt  
3Y7ldU9+LBLI6e1KS5lfc5jlTGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2kl  
Bd6h4wrbbHA2XE1sq21ykja/Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o  
2n1vP1D+tD3amHsK7QIDAQAB  
-----END PUBLIC KEY-----'; 
或者
$public_key = <<<EOF
-----BEGIN PUBLIC KEY-----  
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3//sR2tXw0wrC2DySx8vNGlqt  
3Y7ldU9+LBLI6e1KS5lfc5jlTGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2kl  
Bd6h4wrbbHA2XE1sq21ykja/Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o  
2n1vP1D+tD3amHsK7QIDAQAB  
-----END PUBLIC KEY-----
-----END RSA PRIVATE KEY-----
EOF;
View Code

openssl_public_encrypt(string $data , string &$crypted , mixed $key [, int $padding = OPENSSL\_PKCS1\_PADDING ] )

 公匙加密数据,其中$data是要加密的数据;$crypted是一个引用变量,加密后的数据会被放入这个变量中;$key是要传入的公匙数据;由于被加密数据分组时,有可能不会正好为加密位数bit的整数倍,所以需要$padding(填充补齐),$padding的可选项有 OPENSSL_PKCS1_PADDING, OPENSSL_NO_PADDING,分别为PKCS1填充,或不使用填充;

与此方法相对的还有(传入参数一致):

openssl_private_decrypt(); // 使用私匙解密;

openssl_private_encrypt() // 使用私匙加密;

openssl_public_decrypt();   // 使用公匙解密;

要注意的是,私钥加密的内容通过公钥可用解密出来  

签名和验签函数:

bool openssl_sign ( string $data , string &$signature , mixed $priv_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] )
int openssl_verify ( string $data , string $signature , mixed $pub_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] )

签名函数:$data为要签名的数据;$signature为签名结果的引用变量;$priv_key_id为签名所使用的私匙;$signature_alg为签名要使用的算法,其算法列表可以使用openssl_get_md_methods ()得到

验签函数:与签名函数相对,只不过它要传入与私匙对应的公匙;其结果为签名验证结果,1为成功,0为失败,-1则表示错误;

同样,私钥签名时验签要使用公钥密钥

openssl_free_key(resource $key_id);从内存中释放和指定的 key_identifier相关联的密钥。

猜你喜欢

转载自www.cnblogs.com/7qin/p/10684351.html