二、支付安全(证书秘钥签名)

二、支付安全(证书/秘钥/签名)

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、数字签名

数字签名是使用私钥对摘要加密生成签名,需要由公钥将签名解密后进行验证,实现身份认证和不可否认

签名和验证签名的流程

image-20220531005421740

6、数字证书

数字证书解决“公钥的信任”问题,可以防止黑客伪造公钥。

不能直接分发公钥,公钥的分发必须使用数字证书,数字证书由CA颁发

https协议中的数字证书:

image-20220531005442552

7、微信APIv3证书

商户证书

商户API证书是指由商户申请的,包含商户的商户号、公司名称、公钥信息的证书。

商户证书在商户后台申请:点击这里

image-20220531005451697

平台证书(微信支付平台):

微信支付平台证书是指由微信支付 负责申请的,包含微信支付平台标识、公钥信息的证书。商户可以使

用平台证书中的公钥进行验签。

平台证书的获取:点击这里

image-20220531005503380

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备注
1hhhaaa原串
2hhaaah6除以2向取整是3,取s中的第3个字符卜拼到t的末尾
3hhaaha5除以2向上取事是3,取s中的第3个字符西拼到t的末尾
4haahah4除以2向上收整是2,取s中的第2个字符h拼到t的末尾
5hahaha3除以2向上取整是2,取s中的第2个字符a拼到t的末尾
6ahahah2除以2向上取整是1,取s中的第1个字管h拼到t的末尾
7hahaha1 除以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在线支付实战-微信支付/支付宝支付,非全部原创内容。但是会根据自己的思考或者理解加一些内容或细节。

写在后面

欢迎关注,进期会经常发一些工作中遇到的问题,或者需要学习的知识。

需要其他算法题也可以私信我哦!

欢迎随时留言讨论,知无不答!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值