(一)关于网络传输中的加密和加签的问题
开发中经常会存在不同系统之间的数据共享,那么通过接口方式传输数据就是一件很方便的方式了。现在还有很多公司是用的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对称加密对内容进行了加密,这是个锁,但我们想要让别人打开这个锁,就需要通过私钥进行加密,生成一个钥匙。别人当获取到这钥匙的时候就可以对你加密的内容知道怎么解密了。
------ 越努力越幸运 每日一博客