请选择 进入手机版 | 继续访问电脑版

默认
打赏 发表评论 8
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
即时通讯安全篇(六):非对称加密技术的原理与应用实践
微信扫一扫关注!

前言


上文我学习了对称加密算法在Android平台的原理和应用实践(上文链接点此进入),本文将要分享的是非对称加密技术在当前互联网场景下的应用情况。

理论上非对称加密技术比对称加密技术要复杂的多,当然也安全的多,但性能也相对要低的多,到底是用对称加密还是非对称加密,这就需要您自已根据业务场景自行组合,因为两种不同的加密算法都有各自的优势和劣势,没有绝对的好与坏,关键是你更看重哪项指标。

本系列文章中的前两篇《即时通讯安全篇(一):正确地理解和使用Android端加密算法》、《即时通讯安全篇(三):常用加解密算法与通讯安全讲解》也有对非对称加密算法的研究和实践总结,您也可前往查阅。

IM安全系列文章


本文是IM通讯安全知识系列文章中的第6篇,总目录如下:


认识非对称加密算法


与对称加密算法不同,非对称加密算法需要两个密钥:公钥(publickey)和私钥(privatekey)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

1.jpg

常见的非对称加密算法


常见的非对称加密算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等,其中支付宝使用的就是RSA算法。

RSA 算法原理


以非对称加密算法RSA为例,原理无非涉及:质因数、欧拉函数、模反元素等,当然完整的技术原理很复杂,对于应用层开发者而言如果没有必要,建议只需要知道内部是基于分解质因数和取模操作即可,并非必须要深入理论研究。

RSA算法在Android平台上的使用步骤


我们以Andriod平台为例,看看典型的非对称加密算法RSA的使用步骤:
//1,获取cipher 对象
Cipher cipher = Cipher.getInstance("RSA");
//2,通过秘钥对生成器KeyPairGenerator 生成公钥和私钥
KeyPair keyPair = KeyPairGenerator.getInstance("RSA").generateKeyPair();
//使用公钥进行加密,私钥进行解密(也可以反过来使用)
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
//3,使用公钥初始化密码器
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
//4,执行加密操作
byte[] result = cipher.doFinal(content.getBytes());
//使用私钥初始化密码器
cipher.init(Cipher.DECRYPT_MODE, privateKey);
//执行解密操作
byte[] deResult = cipher.doFinal(result);

需要注意的地方:
//一次性加密数据的长度不能大于117 字节
private static final int ENCRYPT_BLOCK_MAX = 117;
//一次性解密的数据长度不能大于128 字节
private static final int DECRYPT_BLOCK_MAX = 128;

分批操作:
/**
* 分批操作
*
* @param content 需要处理的数据
* @param cipher 密码器(根据cipher 的不同,操作可能是加密或解密)
* @param blockSize 每次操作的块大小,单位为字节
* @return 返回处理完成后的结果
* @throws Exception
*/
 public static byte[] doFinalWithBatch(byte[] content, Cipher cipher, int blockSize) throwseption {
 int offset = 0;//操作的起始偏移位置
 int len = content.length;//数据总长度
 byte[] tmp;//临时保存操作结果
 ByteArrayOutputStream baos = new ByteArrayOutputStream();
 //如果剩下数据
 while (len - offset > 0) {
     if (len - offset >= blockSize) {
        //剩下数据还大于等于一个blockSize
        tmp = cipher.doFinal(content, offset, blockSize);
     }else {
         //剩下数据不足一个blockSize
         tmp = cipher.doFinal(content, offset, len - offset);
         }
     //将临时结果保存到内存缓冲区里
     baos.write(tmp);
     offset = offset + blockSize;
     }
     baos.close();
     return baos.toByteArray();
 }

非对称加密算法在实际应用中的用途


1用于身份认证


一条加密信息若能用A 的公钥能解开,则该信息一定是用A 的私钥加密的,该能确定该用户是A。

2.jpg

2用于陌生人通信


A 和B 两个人互不认识,A 把自己的公钥发给B,B 也把自己的公钥发给A,则双方可以通过对方的公钥加密信息通信。C 虽然也能得到A、B 的公钥,但是他解不开密文。

3.jpg

3用于敏感的秘钥交换场景下


A 先得到B 的公钥,然后A 生成一个随机秘钥,例如13245768,之后A 用B 的公钥加密该秘钥,得到加密后的秘钥,例如dxs#fd@dk,之后将该密文发给B,B 用自己的私钥解密得到123456,之后双方使用13245768 作为对称加密的秘钥通信。C 就算截获加密后的秘钥dxs#fd@dk,自己也解不开,这样A、B 二人能通过对称加密进行通信。

4.jpg

本文小结


非对称加密一般不会单独拿来使用,他并不是为了取代对称加密而出现的,非对称加密速度比对称加密慢很多,极端情况下会慢1000 倍,所以一般不会用来加密大量数据,通常我们经常会将对称加密和非对称加密两种技术联合起来使用,例如用非对称加密来给称加密里的秘钥进行加密(即秘钥交换)。

(原文链接:http://blog.csdn.net/axi295309066/article/details/52494640,有删节和改动)

更多即时通讯安全文章


即时通讯安全篇(一):正确地理解和使用Android端加密算法
即时通讯安全篇(二):探讨组合加密算法在IM中的应用
即时通讯安全篇(三):常用加解密算法与通讯安全讲解
即时通讯安全篇(四):实例分析Android中密钥硬编码的风险
即时通讯安全篇(五):对称加密技术在Android平台上的应用实践
即时通讯安全篇(六):非对称加密技术的原理与应用实践
传输层安全协议SSL/TLS的Java平台实现简介和Demo演示
理论联系实际:一套典型的IM通信协议设计详解(含安全层设计)
微信新一代通信安全解决方案:基于TLS1.3的MMTLS详解
来自阿里OpenIM:打造安全可靠即时通讯服务的技术实践分享
简述实时音视频聊天中端到端加密(E2EE)的工作原理
移动端安全通信的利器——端到端加密(E2EE)技术详解
Web端即时通讯安全:跨站点WebSocket劫持漏洞详解(含示例代码)
通俗易懂:一篇掌握即时通讯的消息传输安全原理
IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token
快速读懂量子通信、量子加密技术
即时通讯安全篇(七):如果这样来理解HTTPS原理,一篇就够了
一分钟理解 HTTPS 到底解决了什么问题
一篇读懂HTTPS:加密原理、安全逻辑、数字证书等
>> 更多即时通讯技术相关的文章点此进入 ……

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:即时通讯安全篇(五):对称加密技术在Android平台上的应用实践下一篇:基于XMPP的开源Smack库的IM登录时报错求助

本帖已收录至以下技术专辑

推荐方案
评论 8
这篇接地气,通俗易懂,头一次理解了非对称加密
签名: 秋天到了,终于凉快了
好贴,Mark一下
@JackJiang 我想请教一个问题,RSA加密在数据比较长的情况下比较耗时,那么如果我加密这段数据的100个字节,那么剩下的字节在不解密的情况下能否解析?(如此段数据是一个1000字节长的json)
签名: hello world
引用:Bluedaquiri 发表于 2018-06-20 14:59
@JackJiang 我想请教一个问题,RSA加密在数据比较长的情况下比较耗时,那么如果我加密这段数据的100个字节 ...

理论上可以,你可以写个demo试试
引用:JackJiang 发表于 2018-06-20 15:20
理论上可以,你可以写个demo试试

@JackJiang 感谢回复,在社区中帖子中有介绍通过服务器与客户端各自交换公钥来完成RSA加密的方式,我想把它应用到实际开发中,但是我担心RSA加密解密的耗时影响到服务器端,您有什么好的建议吗?
签名: hello world
引用:Bluedaquiri 发表于 2018-06-20 15:34
@JackJiang 感谢回复,在社区中帖子中有介绍通过服务器与客户端各自交换公钥来完成RSA加密的方式,我想把 ...

RSA加解密肯定会影响到性能,但没什么纠结的,就看你是看重性能还是安全性了
很实用
签名: 心情好
不错不错
签名: read the fucking source code
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部