支付接口教程特别篇——公钥与私钥,双钥加密和数字签名

简介: 不知道有没有高考志愿报了电子商务专业的同学,不出意外的话你们以后有门课就是电子支付原理。小编总结了一些私钥与公钥的知识,不一定完全正确,但至少可以帮助人们理解。

不知道有没有高考志愿报了电子商务专业的同学,不出意外的话你们以后有门课就是电子支付原理。
小编总结了一些私钥与公钥的知识,不一定完全正确,但至少可以帮助人们理解。
我们将以提问的方式循序渐进(其实也是我的心路历程),让我们开始。

什么是公钥与私钥?

总的来说,是一种采用RSA算法对网络数据进行加密传输的方式。采用这种方式加密,需要生成两串秘钥,公开的叫做公钥,未公开的称为私钥。它们都可以用于加密和解密文件。

什么是RSA算法?

RSA算法一直是使用范围最广的"非对称加密算法",早在1977年就已经诞生。具体的原理并不难,但不是我们今天讨论的重点。
只需要记住使用这种算法,加密和解密的时候所使用的密码不一样,但密码永远是成对出现的。
也就是说,一个箱子配备了两把钥匙,你用其中一把钥匙把箱子锁住,再用这把钥匙是打不开的,需要用另一把,反之亦然。

公钥和私钥到底哪个用来加密,哪个用来解密?

公钥和私钥是同时存在的一对秘钥,在本质上没有区别。
例如,A秘钥加密的文件可以用B秘钥解密(AB秘钥必须为一对),B秘钥加密的文件可以用A秘钥解密(不能自己解密自己)。只不过人人都知道的叫做公钥,只有一个人知道的叫做私钥。
所以,公钥和私钥只是人为赋予的名称,和哪个加密,哪个解密并没有直接的关系
之所以会存在这个问题,原因是使用的场景不同,我们先直观的看看这两种情况:

  1. 你有两个字母A和B,你用A加密了一个文件,此时只有B可以解密,然后你告诉所有人,这里有一个我用A加密过的文件。虽然人人都可以复制一份加密文件到自己的电脑上,但是他们并不知道B可以解密。然后你想把这个文件交给我,所以告诉我字母B可以解密,此时我也去复制了一份文件,并且用字母B进行解密,我也就看到了文件的内容。这样就达到了保护数据的目的,此时公钥用于加密,私钥用于解密

  2. 我有A、B两个字母,一开始就通知了所有人,想和我说话的同学请用字母B进行加密。这个时候你把用字母B加密过的文件公开了出来,并注明我来查收。但是,总有那么些坏人会查收一些不是留给自己文件,但是坏人拿到的是加密过的文件,而且并不知道A可以用来解密。所以只有当我拿到文件时,用A进行解密可以知道内容。也达到了保护数据的目的,此时仍然是公钥用于加密,私钥用于解密

上面两种情况都是公钥加密的情况,比较容易理解。那么我们想一下,如果用私钥加密,那么就意味着所有人都能解密我发出的信息,这种情况有什么用呢?答案就是数字签名

  1. 我现在使用字母A加密了我的文件(A并不会公开),然后我告诉所有人请用字母B来解密,现在大家都知道了我发的内容。但是,如果有人想伪造的文件呢。此时,如果你用B解密了密文,那么你自然会想到,这个文件肯定是由我发出的,因为能用字母B解密的文件肯定是字母A所加密的,而只有我才知道字母A。这样就达到了确认文件来源的目的。

  2. 我收到了一句话,内容是让我立即关闭电脑,还附带了一个数字签名,但是我认为只有我老婆才能让我关掉电脑。这个时候我去问她“你加密文件的公钥是什么”,她生气的告诉我是字母B(她的公钥),然后我用字母B去解密数字签名,解密出的内容是一句英语“Turn off computer”。我用百度已翻译发现是让我关闭电脑的意思。我明白了两个问题:第一,我能够解密数字签名,说明这句话确实是她发送给我的。第二,解密出来的内容和我收到的那句话意思是一样的,代表这句话并没有被人篡改过。那么此时,我欣然的关闭了我的电脑。

其实,第四个场景才是支付接口集成常遇到的情况,前面几个只是帮助理解双钥加密的原理罢了。当然,实际的数字签名要比这些文字复杂的多,比如说双人双钥的情况。

为什么有些支付接口要采用双钥加密?

目的无非就是两个:保证信息来源可靠性,和保证信息完整性
这两点在支付流程中是及其重要的,毕竟涉及到钱的东西,谁都不敢含糊。双钥加密目前并没有组织声称可以破解,所以能够最大限度的保障支付数据的安全。
比如,后面要介绍支付宝APP支付和银联支付就是双钥加密的。

为什么有的接口又不用呢?

实际上之前介绍的接口采用的是对称加密的算法,即加密与解密使用同样的秘钥。
虽然认为对称加密不如非对称加密安全,但是也没有任何迹象表面对称加密会被淘汰,而且对称加密更简单易用。
其实,对称加密最大的风险就在于秘钥管理。这就是为什么我们之前介绍的微信支付,在收集秘钥的时候,总是多次验证,而且秘钥只给你看一眼。


以上内容属于作者原创,特此声明,如需转载,请留言取得同意

目录
相关文章
|
5月前
|
安全 算法 Java
互联网并发与安全系列教程(12) - 信息加密技术(单向散列加密)
互联网并发与安全系列教程(12) - 信息加密技术(单向散列加密)
43 0
|
2月前
|
机器学习/深度学习 安全 算法
【现代密码学】笔记9-10.3-- 公钥(非对称加密)、混合加密理论《introduction to modern cryphtography》
【现代密码学】笔记9-10.3-- 公钥(非对称加密)、混合加密理论《introduction to modern cryphtography》
26 0
|
3月前
|
安全 Java 数据安全/隐私保护
Android和iOS应用程序加固方法详解:混淆、加壳、数据加密、动态加载和数字签名实现
Android和iOS应用程序加固方法详解:混淆、加壳、数据加密、动态加载和数字签名实现
70 0
|
4月前
|
Go 数据安全/隐私保护
Go License 公钥 私钥 加密 解密
Go License 公钥 私钥 加密 解密
38 0
|
8月前
|
自然语言处理 网络协议 安全
为什么用公钥加密却不能用公钥解密?
为什么用公钥加密却不能用公钥解密?
197 0
|
9月前
|
前端开发 数据可视化 安全
Spring Boot + vue-element 开发个人博客项目实战教程(十、调试、密码加密和Swagger接口文档)(下)
Spring Boot + vue-element 开发个人博客项目实战教程(十、调试、密码加密和Swagger接口文档)(下)
115 0
|
9月前
|
存储 SQL Java
Spring Boot + vue-element 开发个人博客项目实战教程(十、调试、密码加密和Swagger接口文档)(上)
Spring Boot + vue-element 开发个人博客项目实战教程(十、调试、密码加密和Swagger接口文档)(上)
67 1
|
9月前
|
数据安全/隐私保护
【文件加密】电脑文件夹简单加密教程
【文件加密】电脑文件夹简单加密教程
1376 0
|
C# 数据安全/隐私保护
C#使用SHA1加密类(RSAFromPkcs8)支持1024位和2048位私钥
C#使用SHA1加密类(RSAFromPkcs8)支持1024位和2048位私钥
229 0
|
PHP 数据安全/隐私保护
php 生成加密公钥加密私钥
php 生成加密公钥加密私钥