(一)关于网络传输中的加密和加签的问题

开发中经常会存在不同系统之间的数据共享,那么通过接口方式传输数据就是一件很方便的方式了。现在还有很多公司是用的http传输的数据,那么数据是不安全的存在着数据在传输过程中发生泄漏的风险,所以现在数据传输常用的就是加密和加签的方式来保证数据的安全。

加密和加签中用到了非对称性加密(RSA),而非对称性加密需要两个秘钥来进行加密和解密,这两个秘钥是公钥(publickey)和私钥(privatekey)。公钥一般都是给别人的,自己留着私钥,这样即使别人知道了公钥没有私钥,所以加强了数据的安全性。

首先我们要明白什么是秘钥,秘钥是由RSA(公钥+模值)、(私钥+模值)分组分发的,单独发公钥或者私钥匙没有用的,所以我们俗话说的“**”其实是他们两者中的其中一组。但我们说的“**长度”一般只是指模值的位长度。目前主流可选值:1024,、2048、3047。模值有专门的工具素数生成器,给他几个数,告诉他多少位的素数他就会帮你自动生成。素数生成器有时候也会是1023也会是1024 自己要看好。

明文长度和密文长度,1024对应的明文长度是128字符,但因为考虑到自适应所以要用到RSA的padding模式,padding模式要占11字符,所以实际上的明文长度就是128-11=117字符。密文长度就是明文加密后的长度。 

数据加签:

首先我们需要我们导个包,SADK 

这个jar包里有

SecKeyEncrypt:使用公钥对数据进行加密

SecKeyDecrypt:使用私钥对数据进行解密

SeckeyRawVerify:使用公钥 对数字签名和数据进行验证,以确认该数据的来源合法性。

SecKeyRawSign:使用私钥对数据进行摘要并生成数字签名

RSA算法有2个作用一个是加密一个是加签。从这几个函数中,我们可以看到,我们第一种是使用公钥能在客户端:数据加密,以及服务器端用私钥解密。

·· 第二个就是用私钥在客户端加签,然后用公钥在服务器端使用公钥解签。第一种完全是为了加密,第二种是为了防抵赖,就是为了防止别人模仿我们的客户端来攻击我们的服务器,导致瘫痪。

publicCertFilePath:公钥

encPfxFilePath:私钥

encPfxFilePwd:私钥密码


下面是具体的代码:


(一)关于网络传输中的加密和加签的问题

我们可以看到这个方法是为了对内容进行加签的,

URLDecoder.decode这个API的目的是对私钥进行UTF-8格式的字符串解码,指定字符集。

我们通过调用SADK包中的方法,对加密进行初始化,通过获取私钥的方法:getPrivateKeyFromPFX,我们得到了私钥priKey。

通过Signature类的p1SignMessage方法来对内容进行加签并将字节数组装换成字符串,Mechanism.SHA1_RSA是模值。


(一)关于网络传输中的加密和加签的问题

  获取公钥里的内容转换成流,X.509 数字证书生成及验证的国际标准。

   Base64.decode 将String转成字节数组




加签:

(一)关于网络传输中的加密和加签的问题

KeyGenerator是AES算法秘钥生成器类, 然后初始化秘钥生成器并规定秘钥大小128字节,生成一个秘钥SercretKey,

返回一个基本编码的字符数组,key是一个通过AES加密后的秘钥。这里的AES是对称性加密。


(一)关于网络传输中的加密和加签的问题

基本流程和加签是差不多的。


(一)关于网络传输中的加密和加签的问题

Cipher创建密码器 ,然后初始化,通过cipher.doFinal来对内容进行加密,Base64.encode返回字节数组,Base64是一种编码方式,加密算法输出都是byte[] 统一Base64避免出现乱码。


(一)关于网络传输中的加密和加签的问题



总结;很多人在开始的时候,能够理解加签和解签是什么意思,但对加密不是很了解会走入误区,我举个例子:

我用通过AES对称加密对内容进行了加密,这是个锁,但我们想要让别人打开这个锁,就需要通过私钥进行加密,生成一个钥匙。别人当获取到这钥匙的时候就可以对你加密的内容知道怎么解密了。




------   越努力越幸运      每日一博客