python + openssl对数据进行签名

文章目录

    • 1. 基础介绍
    • 2. 签名流程
    • 3. python签名版
      • 3.1 使用的工具:python3+pyopenssl+base64+openssl
      • 3.2 签名的代码
    • 4. php签名版

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. 签名流程

这里身份确认一般需要经过以下几个步骤:

sender receiver 生成公钥私钥 发送公钥 用私钥对数据进行签名 签名后的数据 用sender的公钥验证是否能解密 这个数据确实是sender发的! sender receiver

3. python签名版

3.1 使用的工具:python3+pyopenssl+base64+openssl

  1. 先来安装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签名版


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;
    }
}

你可能感兴趣的:(计算机科学基础,python,php,openssl,数字签名)