pem文件和key文件(pem key文件的作用)

pem文件和key文件(pem key文件的作用)svg xmlns http www w3 org 2000 svg style display none svg

大家好,我是讯享网,很高兴认识大家。



 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> 

讯享网

我们都知道Http协议中参数的传输是这种简直对形式的,如果要传多个参数就需要用符号对键值对进行分割。如 ,这样在服务端在收到这种字符串的时候,会用分割出每一个参数,然后再用来分割出参数值。

如何解决上述问题带来的歧义呢?解决的办法就是对参数进行URL编码?

URL编码只是简单的在特殊字符的各个字节前加上%,例如,我们对上述会产生奇异的字符进行URL编码后结果:,这样服务端会把紧跟在“%”后的字节当成普通的字节,就是不会把它当成各个参数或键值对的分隔符。

类似于这种

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yyMpbzea-15)(加密与安全/64.png)]

实际操作

讯享网

打印

实际操作

 

打印

的编码

只需要把Base64.getEncoder()改为Base64.getUrlEncoder(),Base64.getDecoder()改为Base64.getUrlDecoder()即可。

算法是编码算法,不是加密算法。编码的目的是把任意二进制数据编码为文本(长度增加 1/3 ).

是一种摘要算法,所谓摘要算法,就是输入任意长度数据,而输出的是固定长度数据。

举例:的方法就是摘要算法。

有没有可能两个不同的输入得到了相同的输出?是有可能的,这也称之为碰撞!

算法长度一长度二MD5128bits16bitsSHA-1160bits20bitsSHA-bits32bitsRipeMD160bits20bits
实际操作
讯享网

打印

24f93872e1db308f75eb317e3649e814

说明:的输入参数是数组,不是字符串。

和其实加密过程是一样的,不过前者比后者安全一些,但是运行速度削微慢了那么一丢丢(约25%)。

只是把上面的改为即可。

实际操作

 

打印

0b5d7ed54bee16756a7579c6718ab01e3d1b75eb

什么是对称加密?对称加密就是加密和解密使用的是同一个密钥。

通过传入一个密钥和代加密的字符串进行加密。

解密:encrypt(key,message)—>得到加密后的结果

解密:decrypt(key,加密后的结果)---->解密后的结果

常用的对称加密算法

算法密钥长度DES56/64AES128/192/256
密钥长度越长,该算法的加密力度越大,说明越安全!由于DES加密算法的密钥长度太短,以至于可以被人暴力激活成功教程,因此被淘汰弃用。

实际操作

讯享网

打印

RSA非对称加密认证

前提:A和B在私底下要互换对方的公钥,而私钥则自己持有!

加密:A给B发送消息,使用B的公钥加密,然后B收到消息后使用自己的私钥解密。

签名:A使用自己的私钥对数据进行签名,然后发送给B,然后B使用A的公钥进行验签,校验数据的完整性。

说明

使用公钥加密,使用私钥解密;使用私钥签名,使用公钥验签。

签名的作用:

A给B发送消息,加密之后发送给B,此时,一个黑客使用B的公钥加密了一些数据也发送给了B,那么B怎么才能知道收到的加密数据是A发送的而不是黑客?

这时就需要签名了,A加密后并对加密后的数据进行签名,使用A自己的私钥进行签名,发送到B之后,B再使用A的公钥进行验签,如果验签通过则说明加密数据是由A发送过来的。


讯享网

朕给你们提供一个工具类,一切加密的起源都可以源于这个工具类。

本工具类说明书

方法一:string2PublicKey()将Base64编码的公钥转化为公钥对象

参数:(Base64格式的)公钥字符串 返回值:公钥对象

方法二:string2PrivateKey()将Base64编码的私钥转化为私钥对象

参数:(Base64格式的)私钥字符串 返回值:私钥对象

方法三:encrypt() 加密方法

参数:待加密的内容(字符串) 加密使用的密钥(对方公钥) 加密使用的模式(RSA)

返回值:内容加密后的Base64编码形式的字符串

方法四:decrypt() 解密方法

参数:待解密的内容的Base64编码形式的字符串 解密使用的密钥(自己私钥) 解密使用的模式(RSA)

返回值:原文字符串

方法五:handleData()分段处理加解密数据,放到输出流中(这里不做解释)

方法六:sign() 签名算法

参数:要签名的数据(原文或密文均可) 签名使用的密钥(自己私钥) 签名使用的模式(SHA1withRSA)

返回值:签名字符串

方法七:verifySign() 验签算法

参数:签名字符串 验签使用的密钥(对方公钥) 签名使用的模式(SHA1withRSA)

返回值:布尔类型

 

如果使用 RSA,对消息摘要算法则会有多种选择,因此,可以将签名算法指定为 、 或 。因为没有默认的算法名称,所以必须为其指定名称。

开始加密签名

首先定义一下自己的私钥和对方的公钥。

讯享网

加密和签名(传进的参数是待加密的数据【json串】)

 

解密和验签

讯享网

结束语:其实只要利用好这一个工具类即可,然后加解密以及签名验签的过程可以任意封装。

在工具类中定义了一些静态变量,这些变量是要视情况而改变的。

KEY_ALGORITHM=“RSA” 这是加解密算法

KEY_SIZE=1024 这是使用密钥的长度(1024 or 2048)

MAX_ENCRYPT_BLOCK 这是单块明文的最大字节数 (KEY_SIZE 除以 8 然后减去 11 )

MAX_DECRYPT_BLOCK 这是单块密文的最大字节数 (KEY_SIZE 除以 8 )

encryptAlgorithm=“RSA/ECB/PKCS1Padding” 加密算法(这个没用到,用到的是第一个加密算法【RSA】)

signAlgorithm=“SHA1withRSA” 这是签名算法

以上的所有静态变量都是调用加解密方法和签名验签方法时的参数,具体的加密机制可以找时间抽空了解下,包括分段加解密,不过在这个工具类中已经写好了,不用过多操心这个问题了。

重点:当密钥使用的是1024位长度时,要设为1024,要设为117,要设为128;当密钥使用的是2048位长度时,要设为2048,要设为245,要设为256;

RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行。RSA加密对明文的长度是有限制的,如果加密数据过大会抛出如下异常:

 

转自网上的一篇帖子,对最大明文长度和最大密文长度做了详细的解释!

不管明文长度是多少,RSA 生成的密文长度总是固定的。但是明文长度不能超过密钥长度。比如 Java 默认的 RSA 加密实现不允许明文长度超过密钥长度减去 11(单位是字节,也就是 byte)。也就是说,如果我们定义的密钥(我们可以通过 来定义密钥长度)长度为 1024(单位是位,也就是 bit),生成的密钥长度就是 1024位 / 8位/字节 = 128字节,那么我们需要加密的明文长度不能超过 128字节 -11 字节 = 117字节。也就是说,我们最大能将 117 字节长度的明文进行加密,否则会出问题(抛诸如 的异常)。

自己总结

相反,如果密钥长度使用的是2048位 /(8位/字节) = 256字节 的话,那么最大单块密文长度就是256字节,最大单块明文长度就是256 - 11 = 245(字节)。

这里提供一个密钥对生成工具,在 <我的下载> 列表中,可以下载使用!

上面引入网上的帖子可以看出,加密一次最多只能加密明文的117字节(如果key长度为1024位的话),那么明文太多怎么办?只能分段加密了,很好懂的道理,把明文结成一段一段的,分别进行加密,加密之后把加密后的结果再进行拼接。

下面是分段加解密的过程。

讯享网

了解原理即可,会使用工具类就好啦!

使用的国密算法。

 
讯享网

 

小讯
上一篇 2025-04-24 09:37
下一篇 2025-04-16 07:57

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/165228.html