• 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相关联的密钥。

     还有生成密钥

    //生成证书
    function exportOpenSSLFile(){
      $config = array(
        "digest_alg"        => "sha512",                 //摘要算法或签名哈希算法,通常是 openssl_get_md_methods() 之一。
        "private_key_bits"     => 1024,                  //字节数  512 1024 2048  4096 等
        "private_key_type"     => OPENSSL_KEYTYPE_RSA,   //加密类型
      );
      $res = openssl_pkey_new($config);                  //生成一个新的私钥。 成功,返回pkey的资源标识符
      if ( $res == false ) return false;
      openssl_pkey_export($res, $private_key);           //可能生成的私钥为空,需要openssl_pkey_export($res, $private_key, null, $config);
      $public_key = openssl_pkey_get_details($res);      //公钥
      $public_key = $public_key["key"];
      //file_put_contents("./cert_public.key", $public_key);
      //file_put_contents("./cert_private.pem", $private_key);  
        echo "<br><br>
    ";
        print_r($public_key);
        echo "<br><br>
    "; 
        print_r($private_key);
      openssl_free_key($res);
    }
    exportOpenSSLFile();

     源码:

    <?php  
    header('Content-Type:text/html;charset=utf-8');
    //生成密钥
    function newOpensslKey(){
      $config = array(
        "digest_alg"        => "sha512",                 //摘要算法或签名哈希算法,通常是 openssl_get_md_methods() 之一。
        "private_key_bits"     => 1024,                  //字节数  512 1024 2048  4096 等
        "private_key_type"     => OPENSSL_KEYTYPE_RSA,   //加密类型
      );
      $res = openssl_pkey_new($config);                  //生成一个新的私钥。 成功,返回pkey的资源标识符
      if ( $res == false ) return false;
      openssl_pkey_export($res, $private_key);           //可能生成的私钥为空,需要openssl_pkey_export($res, $private_key, null, $config);
      $public_key = openssl_pkey_get_details($res);      //公钥
      $public_key = $public_key["key"];
      //file_put_contents("./cert_public.key", $public_key);
      //file_put_contents("./cert_private.pem", $private_key);  
        echo "<pre>"; 
        print_r($public_key);
        echo "
    "; 
        print_r($private_key);
        echo "<br>"; 
      openssl_free_key($res);
    }
    newOpensslKey();
    echo "以上为密钥生成<hr>
    ";  
    /*--------------------------------------------------------------*/
    $private_key =  <<<EOF
    -----BEGIN RSA PRIVATE KEY-----  
    MIICXQIBAAKBgQC3//sR2tXw0wrC2DySx8vNGlqt3Y7ldU9+LBLI6e1KS5lfc5jl  
    TGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2klBd6h4wrbbHA2XE1sq21ykja/  
    Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o2n1vP1D+tD3amHsK7QIDAQAB  
    AoGBAKH14bMitESqD4PYwODWmy7rrrvyFPEnJJTECLjvKB7IkrVxVDkp1XiJnGKH  
    2h5syHQ5qslPSGYJ1M/XkDnGINwaLVHVD3BoKKgKg1bZn7ao5pXT+herqxaVwWs6  
    ga63yVSIC8jcODxiuvxJnUMQRLaqoF6aUb/2VWc2T5MDmxLhAkEA3pwGpvXgLiWL  
    3h7QLYZLrLrbFRuRN4CYl4UYaAKokkAvZly04Glle8ycgOc2DzL4eiL4l/+x/gaq  
    deJU/cHLRQJBANOZY0mEoVkwhU4bScSdnfM6usQowYBEwHYYh/OTv1a3SqcCE1f+  
    qbAclCqeNiHajCcDmgYJ53LfIgyv0wCS54kCQAXaPkaHclRkQlAdqUV5IWYyJ25f  
    oiq+Y8SgCCs73qixrU1YpJy9yKA/meG9smsl4Oh9IOIGI+zUygh9YdSmEq0CQQC2  
    4G3IP2G3lNDRdZIm5NZ7PfnmyRabxk/UgVUWdk47IwTZHFkdhxKfC8QepUhBsAHL  
    QjifGXY4eJKUBm3FpDGJAkAFwUxYssiJjvrHwnHFbg0rFkvvY63OSmnRxiL4X6EY  
    yI9lblCsyfpl25l7l5zmJrAHn45zAiOoBrWqpM5edu7c  
    -----END RSA PRIVATE KEY-----
    EOF;
      
    $public_key = '-----BEGIN PUBLIC KEY-----  
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3//sR2tXw0wrC2DySx8vNGlqt  
    3Y7ldU9+LBLI6e1KS5lfc5jlTGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2kl  
    Bd6h4wrbbHA2XE1sq21ykja/Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o  
    2n1vP1D+tD3amHsK7QIDAQAB  
    -----END PUBLIC KEY-----'; 
    
    $data = "aassssasssddd";//原始数据  
    $encrypted = "";   
    $decrypted = "";   
      
    // 签名
    $d = openssl_sign($data, $sign, $private_key ,'SHA256');
    $mysign = base64_encode($sign);
    var_dump($d, $mysign,'SHA256');
    echo "<br>";    
    // 验签
    $v = openssl_verify($data, $sign, $public_key ,'SHA256');
    var_dump($v);
    echo "<br>以上为签名与验签<hr>";
    /*--------------------------------------------------------------*/
    
    //echo $private_key;  
    $pi_key =  openssl_pkey_get_private($private_key);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id  
    $pu_key = openssl_pkey_get_public($public_key);//这个函数可用来判断公钥是否是可用的 
    
    print_r($pi_key);
    echo "
    ";  
    print_r($pu_key);
    echo "
    ";  
      
    echo "source data:",$data,"<br>
    ";  
      
    echo "private key encrypt:
    ";  
      
    openssl_private_encrypt($data,$encrypted,$pi_key);//私钥加密  
    $encrypted = base64_encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的  
    echo $encrypted,"
    ";  
      
    echo "public key decrypt:
    ";  
      
    openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);//私钥加密的内容通过公钥可用解密出来  
    echo $decrypted,"
    ";  
      
    echo "
    ";  
    echo "public key encrypt:
    ";  
      
    openssl_public_encrypt($data,$encrypted,$pu_key);//公钥加密  
    $encrypted = base64_encode($encrypted);  
    echo $encrypted,"
    ";  
      
    echo "private key decrypt:
    ";  
    openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key);//私钥解密  
    echo $decrypted,"
    <br><br>";  
    
    echo "<br>以上为加密与解密<hr>";
    /*--------------------------------------------------------------*/
    View Code
  • 相关阅读:
    基于flv.js自定义播放器UI界面
    使用node.js将xmind导出的excel转换为json树
    开启Hyper-V
    vue刷新当前路由
    react native练习
    mock js使用方法简单记录
    前端小技巧总结
    常用js函数开始收集~
    文字跳动
    cordova 修改状态栏的颜色,修改顶部电池字体颜色
  • 原文地址:https://www.cnblogs.com/7qin/p/10684351.html
Copyright © 2020-2023  润新知