1. 基础介绍
在信息传递的过程中为了保证数据是由确定的一方发送的,需要通过某种方式验证数据发送方的身份。目前大家比较常用的可能是是用openssl生成一个私钥,然后根据私钥生成对应的公钥,这个过程可以通过下述两个命令完成:
openssl genrsa -out rsa_private_key.pem 1024
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
这两者的工作机制是,通过公钥加密的数据只能通过对应的私钥才能解密查看。而通过私钥加密的数据如果能被对应的公钥解开则可断定数据由该私钥的所有者发送。前一个机制可以用于加密消息的传递,后一个则可以用于身份的确认,凡事通过公钥A能解密的数据一定是私钥A的所有者发送的数据。
2. 签名流程
这里身份确认一般需要经过以下几个步骤:
3. python签名版
3.1 使用的工具:python3+pyopenssl+base64+openssl
- 先来安装pyopenssl
$pip install pyopenssl
base64是用python内置的就可以了
3.2 签名的代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:pengjian05
# datetime:2018/11/9 10:41
# software: PyCharm
import OpenSSL.crypto as ct
import base64
class Certificate:
_privateKey = ''
def __init__(self, private_key_content):
self._privateKey = private_key_content
def get_sig(self, content):
"""
生成签名
:param content:
:return:
"""
if not content or not self._privateKey:
return False
pkey = ct.load_privatekey(ct.FILETYPE_PEM, self._privateKey)
if pkey:
signature = ct.sign(pkey, content.encode('utf8'), 'sha1')
ret = base64.encodebytes(signature)
return ret.decode('utf8').replace('\n', '')
return False
4. php签名版
<?php
namespace Baidu\Apm\BotMonitorsdk;
class Certificate{
/**
* @param string $privateKeyContent
* @return null
*/
public function __construct($privateKeyContent = '') {
$this->privateKey = $privateKeyContent;
}
/**
* 生成签名
* @param string $content
* @return string|boolean
*/
public function getSig($content) {
if(!$this->privateKey || !$content) {
return false;
}
$privateKey = openssl_pkey_get_private($this->privateKey, '');
if ($privateKey) {
$encryptedData = '';
// 私钥加密
openssl_sign($content, $encryptedData, $privateKey, OPENSSL_ALGO_SHA1);
return base64_encode($encryptedData);
}
return false;
}
}