目录
- 二、支付安全(证书/秘钥/签名)
- 1、信息安全的基础 - 机密性
- 2、对称加密和非对称加密
- 3、身份认证
- 4、摘要算法(Digest Algorithm)
- 5、数字签名
- 6、数字证书
- 7、微信APIv3证书
- 8、API密钥和APIv3密钥
- 9、其余思考
- 补充点
- 算法题:神秘代码
- 其他说明
- 写在后面
二、支付安全(证书/秘钥/签名)
1、信息安全的基础 - 机密性
明文: 加密前的消息叫“明文”(plain text)
密文: 加密后的文本叫“密文”(cipher text)
密钥: 只有掌握特殊“钥匙”的人,才能对加密的文本进行解密,这里的“钥匙”就叫做“密钥”(key) “密钥”就是一个字符串,度量单位是“位”(bit),比如,密钥长度是 128,就是 16 字节的二进制串
加密: 实现机密性最常用的手段是“加密”(encrypt)按照密钥的使用方式,加密可以分为两大类:对称加密和非对称加密。
解密: 使用密钥还原明文的过程叫“解密”(decrypt)
加密算法: 加密解密的操作过程就是“加密算法”
所有的加密算法都是公开的,而算法使用的“密钥”则必须保密
2、对称加密和非对称加密
对称加密
特点:只使用一个密钥,密钥必须保密,常用的有 AES算法
优点:运算速度快
缺点:秘钥需要信息交换的双方共享,一旦被窃取,消息会被破解,无法做到安全的密钥交换
非对称加密
特点:使用两个密钥:公钥和私钥,公钥可以任意分发而私钥保密,常用的有 RSA
优点:黑客获取公钥无法破解密文,解决了密钥交换的问题
缺点:运算速度非常慢
混合加密
实际场景中把对称加密和非对称加密结合起来使用。
3、身份认证
公钥加密,私钥解密的作用是加密信息
私钥加密,公钥解密的作用是身份认证
4、摘要算法(Digest Algorithm)
摘要算法就是我们常说的散列函数、哈希函数(Hash Function),它能够把任意长度的数据“压缩”成
固定长度、而且独一无二的“摘要”字符串,就好像是给这段数据生成了一个数字“指纹”。
作用:
保证信息的完整性
特性:
不可逆:只有算法,没有秘钥,只能加密,不能解密
难题友好性:想要破解,只能暴力枚举
发散性:只要对原文进行一点点改动,摘要就会发生剧烈变化
抗碰撞性:原文不同,计算后的摘要也要不同
常见摘要算法:
MD5、SHA1、SHA2(SHA224、SHA256、SHA384)
MD5、SHA1已经被证明不具有 抗碰撞性
5、数字签名
数字签名是使用私钥对摘要加密生成签名,需要由公钥将签名解密后进行验证,实现身份认证和不可否认
签名和验证签名的流程:
6、数字证书
数字证书解决“公钥的信任”问题,可以防止黑客伪造公钥。
不能直接分发公钥,公钥的分发必须使用数字证书,数字证书由CA颁发
https协议中的数字证书:
7、微信APIv3证书
商户证书:
商户API证书是指由商户申请的,包含商户的商户号、公司名称、公钥信息的证书。
商户证书在商户后台申请:点击这里
平台证书(微信支付平台):
微信支付平台证书是指由微信支付 负责申请的,包含微信支付平台标识、公钥信息的证书。商户可以使
用平台证书中的公钥进行验签。
平台证书的获取:点击这里
8、API密钥和APIv3密钥
都是对称加密需要使用的加密和解密密钥,一定要保管好,不能泄露。
API密钥对应V2版本的API
APIv3密钥对应V3版本的API
9、其余思考
个人理解:
-
公钥和私钥的产生是为了信息传递的安全性。
写信人用收信人的公钥加密信件即可
缺点:不具有完整性
-
信息摘要算法的产生是为了保证信息的完整性。
写信人寄信前前附上信件的摘要即可即可,收件人只需要验证信件摘要是否改变,即可确定信件完整性
缺点:不具有机密性,黑客可以拦截后修改原文和摘要
-
结合以上两点可以确保信息不会被截后修改原文和摘要
写信人寄信前前附上被自己私钥加密后信件的摘要(称为签名),收信人用写信人的公钥解密签名后,再和原文的摘要比对。(整个流程称为验签)
缺点:写信人可以被冒充,也就是公钥信任问题
-
数字证书可以解决是公钥信任问题
证书根据摘要算法生成证书的摘要,用证书的私钥加密摘要,生成证书签名,签名和证书一起发布(称为数字证书)。
寄信人写信时附上数字证书即可证明自己的身份,收信人收信后先验签数字证书。验签通过后,从证书中取出寄件人是公钥,再用寄件人是公钥对信件进行验签。
以上举例中,寄件人为 https 网站,收件人为客户端浏览器。
发布私钥保留公钥会怎么样?
理论上,KeyGen得到的是(e,d,n),(e,d)哪个作为公钥都是可以的,你公开的那个就是公钥,保留的那个就是私钥。
但实现中出于性能考虑,e是选好的e=65537(一开始是e=3,但是有小指数攻击的问题),这样e就只能作为公钥了。
也证实了: 公钥加密私钥解密是的作用是传递信息,私钥加密公钥解密是的作用是身份认证。
补充点
之前同学问过我这样一道题,涉及加密解密,有兴趣的同学可以试试
2022年3月19日晚20:00 美团面试题 第二题 (已AC)
算法题:神秘代码
时间限制: 3000MS
内存限制: 589824KB
题目描述:
小团在网上冲浪的时候发现了一些神秘代码。经过一段时间的研究,小团发现了这些代码的加密规则。
对于个长度为n的字符串s, 其对应的加密字符串t的第个字符是s中的第n/2个字符(向上取整),而中第二到第n个字符则刚好对应s删去第n/2个字符(向上取整)后所得字符串的加密字符串。这个规则也可以用如下流程描述:将t初始化为一个空串,不断地从s中取出第n/2个字符(向上取整)并将其拼到的后面,当s为空时即是所求的加密字符串。为了加快破解流程,小团希望你能设计个命令行工具来帮他进行加密和解密的操作。
输入描述
第一行有两个正整数n,t(1<=n<= 100000,1<=t<=2),代表字符串的
长度以及操作(1为加密,2为解密)
第二行有一个长度为n的字符串s,仅由小写英文字母组成,代表需要进行操作的字符串。
输出描述
输出一个长度为n的字符串,代表操作的结果。
样例输入
6 2
hahaha
样例输出
hhhaaa
提示:
如我们需要加密 hhhaaa
这个串,则进行的步骤如下表:
步骤 | 串s | 串t | 备注 |
---|---|---|---|
1 | hhhaaa | 空 | 原串 |
2 | hhaaa | h | 6除以2向取整是3,取s中的第3个字符卜拼到t的末尾 |
3 | hhaa | ha | 5除以2向上取事是3,取s中的第3个字符西拼到t的末尾 |
4 | haa | hah | 4除以2向上收整是2,取s中的第2个字符h拼到t的末尾 |
5 | ha | haha | 3除以2向上取整是2,取s中的第2个字符a拼到t的末尾 |
6 | a | hahah | 2除以2向上取整是1,取s中的第1个字管h拼到t的末尾 |
7 | 空 | hahaha | 1 除以2向上取整是1,取s中的第1个字符a拼到t的末尾 |
因此 hhhaaa
的加密结果是 hahaha
,反之即 hahaha
的解密结果是 hhhaa
【代码】
public class Main{public static String main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int t = sc.nextInt();String str = sc.next();return t == 1 ? encryption(n, str) : decrypt(n, str);}// 加密public static String encryption(int n, String str) {StringBuilder builder = new StringBuilder(str);StringBuilder res = new StringBuilder();while (builder.length() > 0) {res.append(builder.charAt((builder.length() + 1) / 2 - 1));builder.deleteCharAt((builder.length() + 1) / 2 - 1);}return res.toString();}// 解密public static String decrypt(int n, String str) {StringBuilder builder = new StringBuilder(str);StringBuilder res = new StringBuilder();while (builder.length() > 0) {res.insert(res.length() / 2, builder.charAt(builder.length() - 1));// 在指定的位置10,插入指定的字符串builder.deleteCharAt(builder.length() - 1);}return res.toString();}
}
其他说明
本系列跟学【Java Spring Boot 实战项目】Java在线支付实战-微信支付/支付宝支付,非全部原创内容。但是会根据自己的思考或者理解加一些内容或细节。
写在后面
欢迎关注,进期会经常发一些工作中遇到的问题,或者需要学习的知识。
需要其他算法题也可以私信我哦!
欢迎随时留言讨论,知无不答!