利用OpenSSL生成RAS证书,并用于接口通信的签名

公司最近有一个项目是开放给第三方的服务商调用的,需要我司出相关服务器间调用的SDK。首先考虑到的就是传输数据的安全性,想到的第一方案就是非对称加密解密,我选择使用OpenSSL。

对称加密: 在加密和解密过程中使用相同的密钥, 或是两个可以简单地相互推算的密钥的加密算法.
非对称加密: 也称为公开加密, 它需要一个密钥对, 一个是公钥, 一个是私钥, 一个负责加密, 一个负责解密.
对称加密在性能上要优于非对称加密, 但是安全性低于非对称加密.

考虑到数据安全性的前提下我选择非对称加密,而OpenSSL是首选

OpenSSL初接触的人恐怕最难的在于先理解各种概念
公钥/私钥/签名/验证签名/加密/解密/非对称加密
非对称加密的算法有很多,比较著名的有RSA/DSA ,不同的是RSA可以用于加/解密,也可以用于签名验签,DSA则只能用于签名.至于SHA则是一种和md5相同的算法,它不是用于加密解密或者签名的,它被称为摘要算法.就是通过一种算法,依据数据内容生成一种固定长度的摘要,这串摘要值与原数据存在对应关系,就是原数据会生成这个摘要,但是,这个摘要是不能还原成原数据的,嗯....,正常情况下是这样的,这个算法起的作用就是,如果你把原数据修改一点点,那么生成的摘要都会不同,传输过程中把原数据给你再给你一个摘要,你把得到的原数据同样做一次摘要算法,与给你的摘要相比较就可以知道这个数据有没有在传输过程中被修改了.

OpenSSL非对称加密流程

实际操作之密钥对生成

  • 生成 RSA 私钥(传统格式的)
openssl genrsa -out rsa_private_key.pem 1024
  • 将传统格式的私钥转换成 PKCS#8 格式的
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
  • 生成 RSA 公钥
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

实际操作之加解密方法

  • 加密函数
    function sign($data) {
        $data ['timestamp'] = time ();
        ksort ( $data );
        openssl_sign ( implode ( '', $data ), $data ['sign'], openssl_pkey_get_private ( base64_decode ( file_get_content('rsa_public_key.pem') ) ) );
        $data ['sign'] = base64_encode ( $data ['sign'] );
        return $data;
    }
  • 解密函数
    function verifySign($data) {
        $sign = base64_decode ( $data ['sign'] );
        unset ( $data ['sign'] );
        ksort ( $data );
        if (openssl_verify ( implode ( '', $data ), $sign, openssl_pkey_get_public ( base64_decode ( file_get_content('rsa_private_key.pem') ) ) ) != 1) {
            throw new Exception ( '验证签名错误', 10011 );
        }
        return true;
    }

希望能对由需求的朋友有一些帮助

标签: OpenSSL 加密 解密 通信安全

发表评论: