iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 27
0
Security

看完眼眶濕濕的App開發者慘烈對抗險惡資安環境血與淚的控訴!系列 第 27

Day 27. 混血的最萌 - 混合加密系統(hybrid cryptosystem)

大家好,我是羊小咩

這章來談談混合加密系統(hybrid cryptosystem)

現今大多傳送機制都是使用混合加密系統,原因無他就因速度快,使用安全

SSL/TLS 就是使用混合加密系統實作

另外許多支付系統,銀行業者為了更加的安全,除了使用 SSL/TLS 傳輸安全協議,還會在資料部分,再包一層自己的加密系統

有業者使用硬體機制(HSM),有些使用軟體客製,不外乎都是為了保障使用者和伺服器之間的資料安全

image-20201012182615071

介紹

先前提到的對稱式金鑰(共用金鑰系統),以及非對稱式金鑰(公開金鑰系統)特性,因此單獨使用也有顯著的缺點

  • 對稱式加密
    • 加密速度快
    • 金鑰容易外洩
  • 非稱式加密
    • 金鑰使用保存安全
    • 加密速度慢

混合加密系統(hybrid cryptosystem),依照字面上的意思當然就是混合使用對稱式加密,以及非對稱式金鑰加密系統

使用非對稱式金鑰交換安全特性,配合對稱式加密加密速度快的優勢,通過兩種結合解決,資料很多加密很慢,或金鑰保存不易問題,是結合兩種優點並彌補缺點的密碼系統

混合加密系統加密流程說明

羊打算透過網路傳送資料給咩

咩製作好公開金鑰和私密金鑰

image-20201012112107080

傳送公開金鑰給羊

image-20201012112245202

羊,製作可以快速上鎖(加密)的金鑰(共享金鑰/對稱式金鑰

image-20201012112407160

使用共享金鑰對資料加密

image-20201012112514264

共享金鑰使用公開金鑰加密封裝

image-20201012112553782

將兩個封裝資料傳送給咩(接收者)

image-20201012113138445

image-20201012113151899

使用 私密金鑰 打開使用公開金鑰加密的包裹(裡面放的是共享金鑰)

image-20201012113254125

最後使用共享金鑰解開並取出原始資料

image-20201012113313964

標準一點的加密流程圖

image-20201012115034567

混合加密系統特性

  • 金鑰的封裝
    • 用公開金鑰系統(非對稱金鑰)把金鑰封裝
    • 由於只有私鑰可以解開,不用擔心金鑰洩漏
  • 訊息的封裝
    • 用共享金鑰系統(對稱式金鑰)將訊息加密
    • 即使資料很大,加密速度也很快

範例

這裡使用簡單的 iOS / SWIFT 範例程式,演示怎麼傳送出去資料

首先要先接收公鑰,可以雙方協議怎麼交換,這裡就不另外敘述

但由於我們使用公開金鑰因此明文傳遞也不會有太大問題

有個有名又安全的金鑰交換方式

迪菲-赫爾曼密鑰交換(Diffie–Hellman key exchange)

WIKI DH 介紹

建立隨機AES 金鑰

key: "1111111111111111", iv: "0000000000000000"

將明文進行加密

if
 let aes = try? AES(key: "1111111111111111", iv: "0000000000000000") , // aes128
 let encrypted = try? aes.encrypt(orgiTextView.text!.bytes) ,
 let EncData = encrypted.toBase64()
{
	crypTextView.text = EncData
	print(EncData)
}

將金鑰使用公開金鑰加密

let EncPublicKey = try! PublicKey(base64Encoded: inputPubkey.text!)
let clear = try! ClearMessage(string: "aes128 1111111111111111:0000000000000000", using: .utf8)
let encrypted = try! clear.encrypted(with: EncPublicKey, padding: .PKCS1)
let EncAESData = encrypted.base64String
crypKeyTextView.text = EncAESData
print(EncAESData)

注意這裡要被加密字串資料格式為

金鑰類型 金鑰:初始向量
aes128 1111111111111111:0000000000000000

這個沒有標準的格式,只要傳送方跟接收方協議好即可

用 JSON當然也是OK 的

{"key":"1111111111111111","iv":"0000000000000000"}

最後將 EncData(密文)和加密後的金鑰(EncAESData)這兩個資料傳送出去

小知識:通常我們會將加密金鑰放在 Header 內,密文一樣放在body

然後雙方自定 parser 解需傳輸資料

參考資料

https://en.wikipedia.org/wiki/Hybrid_cryptosystem


上一篇
Day 26. 非對稱式加密演算法 - 橢圓曲線密碼 ECC (實戰篇)
下一篇
Day 28. 憑證綁定 Certificate Pinning 綁起來!
系列文
看完眼眶濕濕的App開發者慘烈對抗險惡資安環境血與淚的控訴!31

尚未有邦友留言

立即登入留言