公钥、私钥、签名、签名验证。我们在说什么?
公钥 私钥 签名 验签 说的啥?
公钥加密,私钥解密 私钥签名,公钥验签
散列算法
散列算法,也叫做哈希函数,是从一个任何一种数据中创建小的数字方法,散列函数把消息或者数据压缩成摘要,有时候也叫做摘要算法。把数据量变小,将数据的格式固定下来。
常用的算法有:MD5 SHA1
MD5
MD5 不是一种加密算法,是一种摘要算法,无论多长的输入, MD5 都会输出长度为 128bits 的一个串。
public static final byte[] computeMD5(byte[] content) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
return md5.digest(content);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
SHA1
SHA1 算法也是一个摘要算法, SHA1 比 MD5 更加安全,对于长度小于 2^64 位的消息,SHA1 会产生一个 160 位的消息摘要。
public static byte[] computeSHA1(byte[] content) {
try {
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
return sha1.digest(content);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
摘要算法有摘要特性和不可逆特性,一般用于检查文件的完整性和数据签名的场景。
加密解密
加密,解密,其实就是将原来的明文文件,使用某种算法,进行计算,得到一段不可读的数据:"密文",是用来保护数据的,保证数据不被非法窃取。
加密算法
对称加密
对称加密,是指的就是:加、解密使用的是同一串秘钥,所以叫做对称加密,对称加密只有一个秘钥作为私钥。
常用算法有:DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和AES
优缺点
对称加密比非对称加密算法效率很高,运行速度快,但是 不是非常安全,秘钥管理分发困难。
非对称的加密
指的是加、解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥,公钥加密,私钥解密,反之,私钥加密,公钥解密。
image
常用算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)
优缺点
安全性更高,公钥是公开的,私钥自己保存, 缺点是运行时间长,速度慢,适合对少量数据进行加密。
编码算法
Base64
Base64 算法就是编码算法,不是加密算法。Base64 编码的目的是把任意二进制编码成文本。
为啥要进行base64编码呢?
一般是因为二进制进行数据传输时,网络中间的有些路由会把 ascii 码中的不可见字符删除,导致数据不一致,因此一般会进行 url 进行 base64编码
测试代码:
String str="测试";
String b64=Base64.getEncoder().encodeToString(str.getBytes("utf-8"));
System.out.println("base64编码之后:"+b64);
String ori=new String(Base64.getDecoder().decode(b64),"utf-8");
System.out.println("base64解码之后:"+ori);
运行结果:
base64编码之后:5rWL6K+V
base64解码之后:测试
base64 编码
utf-8 -> base64(编码) -> ASCII
base64 解码
ASCII -> base64(解码) -> utf-8
URLEncode
Http协议中参数的传输是"key=value"这种键值对形式。
name1=value1&name2=value2
测试代码:
public static void main(String[] args) {
//url编码
String str="测试";
String urlStr=URLEncoder.encode(str);
System.out.println("url编码之后:"+urlStr);
String deStr=URLDecoder.decode(urlStr);
System.out.println("url解码之后:"+deStr);
}
运行结果
url编码之后:%E6%B5%8B%E8%AF%95
url解密之后:测试
签名验签
数字签名,就是通过可鉴别的数字信息验证身份的一种方式。
数据前面有两种运算:签名、验签。
- 发送者使用可以代表自己身份的私钥进行签名。
- 接受者使用私钥对应的公钥进行验签。这样就实现了对消息发送者身份的验证。
签名验签的作用
签名验签可以验证发送方身份,防止 中间人攻击 ,CSRF 跨域伪造身份攻击。
签名验签个过程
消息发送者:
- 报文明文(xml)转换成字节数组, UTF-8 编码。
- 使用 base64 进行编码,生成消息内容数据:msg
- 使用 SHA1 对字节数组进行签名。生成摘要数据:sign
消息接收者:
- 接受消息msg消息后进行 base64 解码。
- 使用 SHA1 算法进行数据msg+sign 验签。
推荐阅读
-
什么是数字签名?公钥与私钥的奥秘解析
-
PKI 公钥基础设施、公有私钥、信息摘要、数字签名、数字证书
-
了解 PKI(公钥和私钥加密、数字签名、数字证书)技术
-
公钥、私钥、数字签名(签名)、数字证书(证书)的关系(图形)
-
对称和非对称加密、公钥和私钥、单向和双向验证、数字签名、数字证书、根证书
-
了解公钥和私钥 - 公钥加密算法又称非对称加密算法,使用不同的密码进行加密和解密,其中一个用于公钥,另一个用于私钥: 公钥和私钥成对使用 公钥称为公钥,私钥称为私钥。 用公钥加密的数据只能用相应的私钥解密 用私钥加密的数据只能用相应的公钥解密。 如果数据可以用公钥解密,则必须用相应的私钥加密。 如果数据可以用私钥解密,则必须用相应的公钥加密。 公钥和私钥是相对的,没有规定哪一个必须是公钥或私钥。 第二,实现数据的安全传输 要实现数据的安全传输,当然要对数据进行加密。 如果使用对称加密算法,加密和解密使用同一个密钥,除了自己要保存外,对方也必须知道密钥才能解密数据。如果把密钥传给对方,就有可能泄露密码。所以我们使用非对称算法,过程如下: 首先,接收方生成一对密钥,即私钥和公钥; 然后,接收方将公钥发送给发送方; 发送方用收到的公开密钥加密数据并发送给接收方; 接收方收到数据后使用自己的私钥解密。 由于在非对称算法中,用公钥加密的数据必须用相应的私钥解密,而私钥只有接收方知道,这就确保了数据传输的安全性。 第三,信息的数字签名 除了确保数据的安全传输,公钥系统的另一个用途是对数据进行签名。通常,"数字签名 "用于验证发送者的身份,帮助保护数据的完整性。 例如,发送者 A 想向所有人发送一些信息,他用自己的私人密钥对信息进行了加密,即签名。这样,每个收到数据的人都能用发送者的公开密钥验证数据,并确认数据是由 A 发送的(因为只有 A 用他的私人密钥签署了数据,所以无法验证发送者的身份)。(因为只有用 A 的私钥签名的信息才能用公钥解密)。使用数字签名可以确认两件事: 保证信息是由签名者本人签名发送的,签名者无法否认或难以否认。 保证信息从发出到收到都没有被以任何方式修改过。 之所以能确认这两点,是因为公钥的解密必然要有相应的私钥加密,而私钥只有签名者持有。 四、公钥算法的缺陷 在现实中,公钥机制也有其缺点,那就是效率很低,比常用的私钥算法(如 DES 和 AES)慢上一两个数量级都有可能。因此,它不适合对大量原始信息进行加密。为了兼顾安全性和效率,我们通常会将公钥算法和私钥算法结合起来使用: 首先,发送方使用对称算法加密原始信息。 接收方使用公钥机制生成一对密钥,一个是公钥,一个是私钥。 接收方将公钥发送给发送方。 发送方用公钥加密对称算法的密钥,然后发送给接收方。 接收方用私人密钥解密对称算法的密钥。 发送方将加密后的原始信息发送给接收方。 接收方使用对称算法的密钥解密信息。 摘要
-
公钥、私钥、签名、签名验证。我们在说什么?
-
以 php 公钥、私钥(SHA1withRSA 签名)和 AES(AES/ECB/PKCS5Padding)加密和解密的签名详情
-
概念解释:对称加密、非对称加密、公钥、私钥、签名、证书
-
RSA 公钥和私钥生成、加密和解密、签名和签名验证的原理和工具