python + openssl对数据进行签名

本文深入探讨了公私钥签名机制,详细介绍了如何使用openssl生成公私钥对,以及利用python和php实现数据签名的过程。文章提供了具体的代码示例,帮助读者理解公钥加密和私钥签名的原理及应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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签名版

<?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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值