工程师的灵魂拷问:你的密钥安全吗?
阿里妹導(dǎo)讀:密鑰管理是密碼學(xué)應(yīng)用的核心問(wèn)題之一。任何涉及加密/簽名的應(yīng)用,無(wú)論算法本身機(jī)制多么安全,最終都會(huì)受到靈魂拷問(wèn):你密鑰存在哪兒?本文實(shí)現(xiàn)了一種安全的密鑰管理方案,基于安全多方計(jì)算技術(shù),避免了客戶端、服務(wù)器端內(nèi)存中的密鑰泄露風(fēng)險(xiǎn),并已經(jīng)在阿里集團(tuán)內(nèi)的密鑰管理系統(tǒng)上線。
背景介紹:密鑰管理
提問(wèn):你密鑰存在哪兒?
對(duì)這一問(wèn)的回答基本可概括為2類(lèi):
a. 本地加解密:密鑰保存在某些介質(zhì)(如配置文件、數(shù)據(jù)庫(kù),也可以是某個(gè)遠(yuǎn)程服務(wù)器)中,用戶在需要進(jìn)行加密/簽名時(shí),從這些介質(zhì)拉取密鑰(可能拉取的只是密鑰密文,需要再解密出密鑰明文),然后本地進(jìn)行加密/簽名。
b. 服務(wù)器加解密:用戶在需要進(jìn)行加密/簽名時(shí),把數(shù)據(jù)請(qǐng)求發(fā)給某個(gè)服務(wù)器,服務(wù)器代為完成加密/簽名工作,將加密/簽名結(jié)果發(fā)回用戶。
一般的密鑰管理系統(tǒng)都可歸到這兩類(lèi)模式,但是他們都存在各自的問(wèn)題:
可能有些同學(xué)覺(jué)得這2類(lèi)風(fēng)險(xiǎn)不夠高,但是對(duì)于高價(jià)值數(shù)據(jù),這些風(fēng)險(xiǎn)是不可忽視的。舉個(gè)例子,假設(shè)你是中本聰,那么你的比特幣創(chuàng)世塊地址對(duì)應(yīng)的私鑰放哪才能不忘掉,同時(shí)不泄露呢?是不是好像這兩種方法都無(wú)法滿足需求了?
基于安全多方計(jì)算的密鑰管理(MPC KMS),也稱(chēng)門(mén)限簽名/門(mén)限加密,即是為了解決這一對(duì)矛盾。簡(jiǎn)而言之,MPC KMS 將用戶密鑰分為 M 份"碎片"(例如 M=2,密鑰是100,可以拆成兩份30和70),存儲(chǔ)在 M 個(gè)不同的服務(wù)器中(例如一份存在A云服務(wù)商,一份存在B云服務(wù)商),任何一個(gè)服務(wù)器都無(wú)法獨(dú)立根據(jù)自己的"碎片"恢復(fù)出用戶密鑰原文。當(dāng)用戶需要進(jìn)行加密/簽名時(shí),則在這 M 個(gè)服務(wù)器之間運(yùn)行一個(gè) MPC 協(xié)議,產(chǎn)生加密/簽名的結(jié)果,且整個(gè)過(guò)程中不需要復(fù)原用戶密鑰。
如果最少只需要 n 個(gè)服務(wù)器參與即可完成協(xié)議,則稱(chēng)之為 n of M 的門(mén)限簽名/加密。
可見(jiàn),在 MPC KMS 中,上述兩種風(fēng)險(xiǎn)均可以得到有效的規(guī)避:首先,用戶本地環(huán)境的安全問(wèn)題不會(huì)導(dǎo)致密鑰泄露;其次,即使某個(gè)服務(wù)器出問(wèn)題,攻擊者也無(wú)法得到用戶的密鑰,必須同時(shí)攻陷 n 個(gè)服務(wù)器,或是 n 個(gè)服務(wù)器管理員一起合謀(如果我們把服務(wù)器部署在多個(gè)獨(dú)立的云服務(wù)系統(tǒng)上,這種同時(shí)出問(wèn)題的概率幾乎可以忽略)。
MPC KMS 這種去中心化密鑰管理的特點(diǎn)和區(qū)塊鏈的共識(shí)機(jī)制具有非常好的兼容性:除了直接用于保管用戶私鑰、節(jié)點(diǎn)密鑰之外,用戶還可以把私鑰托管分成 M 片,托管在區(qū)塊鏈的 M 個(gè)節(jié)點(diǎn),然后設(shè)定僅當(dāng)滿足一定門(mén)限的節(jié)點(diǎn)(例如1/4的節(jié)點(diǎn))產(chǎn)生共識(shí)時(shí)才能動(dòng)用他的某筆數(shù)字貨幣財(cái)產(chǎn);或是設(shè)定某個(gè)軟件包的發(fā)布必須經(jīng)過(guò)一定門(mén)限的節(jié)點(diǎn)簽名等等。
安全多方計(jì)算 MPC 介紹
安全多方計(jì)算( Secure Multi-Party Computation,MPC)在80年代由姚期智院士提出。安全多方計(jì)算協(xié)議允許多個(gè)數(shù)據(jù)所有者進(jìn)行數(shù)據(jù)協(xié)同計(jì)算,輸出計(jì)算結(jié)果,并保證任何一方均無(wú)法得到除應(yīng)得的計(jì)算結(jié)果之外的其他任何信息。
這里的黑色加粗字體的文字是格外需要注意的:不僅僅是無(wú)法獲取原始數(shù)據(jù),而是無(wú)法獲得其他任何信息。以百萬(wàn)富翁問(wèn)題為例:兩個(gè)百萬(wàn)富翁比誰(shuí)的錢(qián)數(shù)更多,最后雙方獲得的唯一信息只能是“大于、等于或小于”;只要泄露了任何的其他額外信息(譬如對(duì)方錢(qián)數(shù)的最高位是1還是2),無(wú)論這個(gè)額外信息多么少,都不能算 MPC。
MPC 還有很多潛在應(yīng)用場(chǎng)景,如基于融合數(shù)據(jù)的聯(lián)合風(fēng)控、聯(lián)合廣告推薦等,它能夠真正實(shí)現(xiàn)“數(shù)據(jù)可用不可見(jiàn)”,在這個(gè)數(shù)據(jù)為王的時(shí)代有著美妙的前景。
安全多方計(jì)算+密鑰管理MPC KMS介紹
技術(shù)架構(gòu)
MPC KMS 即是安全多方計(jì)算 MPC 的一種特殊場(chǎng)景:各方分別持有密鑰的一部分,協(xié)同計(jì)算的目的是加解密/簽名,同時(shí)除了加解密/簽名結(jié)果之外,不泄露任何其他信息。
我們研讀了多篇最新論文[1,2,3],在這些論文的理論基礎(chǔ)之上,實(shí)現(xiàn)了安全兩方 ECDSA 簽名系統(tǒng)。系統(tǒng)的粗粒度交互過(guò)程如下,詳細(xì)算法可以參閱論文。
1.密鑰生成:用戶發(fā)起生成請(qǐng)求,兩臺(tái)服務(wù)器 A 和 B 分別各自獨(dú)立的產(chǎn)生隨機(jī)數(shù) a 和隨機(jī)數(shù) b,a+b 即是簽名時(shí)使用的私鑰。
2.簽名:用戶首先從 A 服務(wù)器拉取 a,然后調(diào)用 B 的服務(wù),把需要簽名的消息message 和 message、a 的加密計(jì)算結(jié)果發(fā)送給 B,和 B 之間運(yùn)行一個(gè)安全兩方簽名協(xié)議,得到最終的簽名值。在整個(gè)過(guò)程中,私鑰a+b沒(méi)有在任何一方的內(nèi)存中復(fù)原,任何一方都無(wú)法了解到私鑰 a+b 的內(nèi)容。
操作流程
最終系統(tǒng)暴露給用戶的是兩個(gè)接口 getPK() 和 sign(),接口以阿里內(nèi)部常用的HSF(High-speed Service Framework) 方式提供,接入非常方便。
Step 1. 用戶首先在密鑰管理服務(wù)器上新建一個(gè)密鑰,后臺(tái)的兩臺(tái)服務(wù)器會(huì)自動(dòng)的產(chǎn)生各自的密鑰分量;
Step 2.用戶調(diào)用 getPK() 獲取該密鑰對(duì)應(yīng)的公鑰;
Step 3.用戶在密鑰管理服務(wù)器上新建一個(gè) SHA256WithECDSA 類(lèi)型的公鑰,選擇手工輸入,輸入 Step 2得到的內(nèi)容;
Step 4.用戶此后就可以通過(guò) sign() 來(lái)調(diào)用安全兩方簽名,通過(guò)密鑰管理服務(wù)器提供的ECDSA verifier 函數(shù),輸入公鑰來(lái)驗(yàn)證簽名的正確性了。
Step 5. 這下安全性超有保障,連管理員都得兩個(gè)服務(wù)器的管理員一起碼代碼才能知道你的私鑰到底是啥了!
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的工程师的灵魂拷问:你的密钥安全吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 长脸了!阿里云这位英雄拿下了世界第一
- 下一篇: 编码规范 | Java函数优雅之道(上)