默認
打賞 發表評論 7
想開發IM:買成品怕坑?租第3方怕貴?找開源自已擼?盡量別走彎路了... 找站長給點建議
即時通訊安全篇(六):非對稱加密技術的原理與應用實踐
閱讀(159293) | 評論(7 收藏4 淘帖1 2

前言


上文我學習了對稱加密算法在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#[email protected],之后將該密文發給B,B 用自己的私鑰解密得到123456,之后雙方使用13245768 作為對稱加密的秘鑰通信。C 就算截獲加密后的秘鑰dxs#[email protected],自己也解不開,這樣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登錄時報錯求助

本帖已收錄至以下技術專輯

推薦方案
評論 7
這篇接地氣,通俗易懂,頭一次理解了非對稱加密
簽名: 秋天到了,終于涼快了
好貼,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加解密肯定會影響到性能,但沒什么糾結的,就看你是看重性能還是安全性了
簽名: 明天出發去鹽城,線下面基會要開始了
很實用
簽名: 心情好
打賞樓主 ×
使用微信打賞! 使用支付寶打賞!

返回頂部
乐彩网17500