数字签名和验签的理解

1)数字签名

在客户端和服务端的通信过程中,会遇到很多的安全问题,无法确认收到的信息是否是真实有效的,而不是中途被人掉包,这个时候数字签名就可以站出来,他的作用就是用来证明消息在通信的过程中未被掉包,是真实有效的。就像我们之前上学请假的时候班主任或者辅导员上的签名一样,用来证明这个请假条是否有效的。

2)验签

验签,顾名思义,就是一个对数字签名进行验证的操作。
以服务端S向客户端C发送一封邮件为例:
1.首先,服务端S将邮件使用双方约定好的某种算法进行运算,例如使用hash算法,生成一个签名
2.然后把这个签名和需要传输的邮件一起使用服务端的私钥进行加密后传输给客户端C
3.客户端C接收到信息后,使用公钥进行解密,获得签名和邮件
4.客户端C使用双方约定好的某种算法进行运算,例如使用hash算法, 将签名回退成邮件
5.客户端C比较传输过来的邮件和算出来的邮件,如果两者一样,那么证明信息真的是服务端S发过来的邮件。

签名https://blog.csdn.net/qq_43103529/article/details/126798025

3)验签实战-api接口加密实战

目前API 接口加密的原因无非就两个:1)核实调用方的身份,签名验签,2)验证调用传输数据,数据加密

目前加密和解密的方式,根据加解密方式的异同可以分为:对称加密和非对称加密

加密算法类型一:对称加密,加密和解密使用的是同一把密
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
RSA数字签名是一种非对称加密技术,可以实现对数据的安全传输和证。在C++中可以通过openssl库来实现RSA数字签名。 下面是RSA数字签名的C++代码示例: ```c++ #include <openssl/rsa.h> #include <openssl/pem.h> #include <openssl/err.h> #include <string> using namespace std; // RSA数字签名 string rsa_sign(const string& data, const string& private_key_file) { RSA* rsa = NULL; FILE* fp = NULL; string sign_data; if ((fp = fopen(private_key_file.c_str(), "r")) == NULL) { return ""; } rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL); if (rsa == NULL) { ERR_print_errors_fp(stderr); fclose(fp); return ""; } unsigned char sha256_data[SHA256_DIGEST_LENGTH]; SHA256((const unsigned char*)data.c_str(), data.length(), sha256_data); unsigned int sign_len = RSA_size(rsa); unsigned char* sign = new unsigned char[sign_len]; memset(sign, 0, sign_len); if (RSA_sign(NID_sha256, sha256_data, SHA256_DIGEST_LENGTH, sign, &sign_len, rsa) == 1) { sign_data.assign((char*)sign, sign_len); } RSA_free(rsa); fclose(fp); delete[] sign; return sign_data; } // RSA bool rsa_verify(const string& data, const string& sign_data, const string& public_key_file) { RSA* rsa = NULL; FILE* fp = NULL; bool result = false; if ((fp = fopen(public_key_file.c_str(), "r")) == NULL) { return false; } rsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL); if (rsa == NULL) { ERR_print_errors_fp(stderr); fclose(fp); return false; } unsigned char sha256_data[SHA256_DIGEST_LENGTH]; SHA256((const unsigned char*)data.c_str(), data.length(), sha256_data); result = RSA_verify(NID_sha256, sha256_data, SHA256_DIGEST_LENGTH, (unsigned char*)sign_data.c_str(), sign_data.length(), rsa); RSA_free(rsa); fclose(fp); return result; } ``` 其中,`rsa_sign`函数实现RSA数字签名,`data`参数为需要签名的数据,`private_key_file`参数为私钥文件路径,函数返回签名后的数据。`rsa_verify`函数实现RSA,`data`参数为原始数据,`sign_data`参数为签名后的数据,`public_key_file`参数为公钥文件路径,函数返回结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZhiguoXue_IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值