在兒童讀物《蝸牛和鯨魚》中,主角在經歷了一次意想不到的遙遠冒險之後,回來後發出了「時間過得真快」和「你還沒長大嗎?」的感慨。距離我們上次撰寫有關 LavaRand 的文章已經過去了大約四年,在此期間,Cloudflare 如何使用實體熵來源來增強網際網路安全性的故事一直在流傳,並引起了許多人的興趣。最初只是單一種類的實體熵來源——熔岩燈,如今已經發展成多種多樣的形式。我們想讓您瞭解 LavaRand 的故事。這篇部落格文章將介紹 LavaRand 中新增的「混亂」來源,以及如何在下一個應用程式中利用該混亂。我們將探討公共隨機性如何開啟對公眾可信隨機性的應用。想像一下,當「隨機抽籤」的發起者聲稱結果未受到某種操縱時,我們無需輕信其言辭。最後,我們將討論時間鎖定加密,這是確保訊息在未來某個選定時間之前無法被解密的方法。
LavaRand 的起源
來自舊金山熔岩燈牆的熵長期以來一直在確保 Cloudflare 連結的隨機性方面發揮作用。
帶有流動蠟的熔岩燈。
Cloudflare 的伺服器每秒總共處理超過 5,500 萬個 HTTP 請求,其中絕大多數透過 TLS 通訊協定進行保護,以確保真實性和機密性。在幕後,像 TLS 這樣的加密通訊協定需要安全隨機性的底層來源——否則,安全保證就會崩潰。
密碼學中使用的安全隨機性需要在計算上與「真實」的隨機性做到無法區分。為此,它既需要通過統計隨機性測試,又需要確保其輸出結果對於任何計算能力有限的對手而言都是不可預測的,無論其已經觀察了多少之前的輸出結果。實現這一點的典型方法是獲取某些隨機「種子」,並將其輸入一個加密安全偽隨機數字產生器 (CSPRNG) 中,該產生器可以根據請求產生一個本質上無窮盡的不可預測位元組串流。CSPRNG 的屬性可確保所有輸出結果對於不知道其內部狀態的人來說,與真正的隨機輸出結果幾乎無法區分。但這一切的關鍵都在於從一開始就存在著一個安全的隨機種子。閱讀這篇部落格,瞭解有關真實隨機性與偽隨機性的更多詳細資料;閱讀這篇部落格,瞭解不安全隨機性可能帶來的一些問題。
多年來,Cloudflare 的伺服器都依賴本地熵來源(例如封包到達或鍵盤事件的精確時間)來為其熵集區播種。雖然沒有理由認定這些伺服器上的本地熵來源不安全或容易受到入侵,但我們不想去賭這種可能性。我們的解決方案是建立一個系統,其中我們的伺服器可以定期使用來自外部來源的真實隨機性重新整理其熵集區。
這就產生了 LavaRand。「Lavarand」這個名稱長期以來一直用於產生隨機性的系統(由 Silicon Graphics 於 1997 年首次使用)。Cloudflare 於 2017 年推出了 LavaRand 系統的執行個體,該系統從舊金山辦公室的熔岩燈牆上收集熵,並透過內部 API 提供。然後,我們的伺服器定期查詢該 API,從 LavaRand 擷取新的隨機性,並將其合併到熵集區中。LavaRand 的作用可以看作是向熵集區混合物中加入的調料!(有關更多技術細節,請閱讀我們之前的部落格文章。)
Cloudflare 舊金山辦公室的熔岩燈。
向辦公室新增混亂
我們位於舊金山的熔岩燈多年來一直不知疲倦地工作,為我們的系統提供新的熵,但現在它們在世界各地都有兄弟姐妹來幫助它們完成工作!隨著 Cloudflare 的發展,我們在辦公室中發現和引入的各種熵來源也在不斷增長。Cloudflare 的 Places 團隊努力確保我們的辦公室反映我們價值觀和文化的各個方面。我們幾個較大的辦公地點都安裝了實體熵系統,隨著時間的推移,我們已經逐漸將這些裝置納入 LavaRand。這些系統之所以引人注目和激動人心,是因為它們以物理力學為基礎,我們可以直觀地觀察到其隨機性。在熔岩燈中,溫暖上升的「熔岩」在熔岩燈中漂浮,與冷卻下沉的斑點相互交織,吸引著我們的注意,就像其他不可預測(且通常還很美麗)的動態系統一樣讓我們著迷。
倫敦不可預測的鐘擺
我們倫敦辦公室的訪客可以看到一堵雙擺牆,其美麗的擺動轉化為 LavaRand 的另一個熵來源,並會進入 Cloudflare 伺服器從中提取隨機性的隨機性集區。
Cloudflare 倫敦辦公室雙擺展示特寫。
對於未經訓練的人來說,鐘擺的影子和旋轉臂在後牆上投下的影子可能看起來很混亂。如果是這樣,那麼這次安裝就可以認定為成功!不同的光照條件和這些影子增加了從這個熵來源捕獲的混亂。
在光線條件不斷變化的情況下。Cloudflare 倫敦辦公室的雙擺展示效果。
事實上,即使這些手臂僅限於二維運動,其軌跡也表現出令人著迷的多樣性,並且可以在數學上證明是混亂的。即使我們忽略空氣阻力、溫度和環境,並假設轉變是完全確定的,最終的長期運動仍然難以預測。特別是,系統對初始條件非常敏感,這種初始狀態(它們所設定的移動方式)與確定性行為相結合,產生一條獨特的軌跡,系統將追蹤這種軌跡,直到鐘擺靜止。隨後,將由倫敦的一名 Cloudflare 員工再次將其啟動。
奧斯汀令人著迷的懸掛裝飾品
漂亮的 Cloudflare 德克薩斯州奧斯汀新辦公室最近迎來了開業一週年慶典。該辦公室在實體熵方面做出了自己的貢獻:位於奧斯汀市中心的 Cloudflare 辦公室入口上方懸掛著一個半透明的懸掛彩虹裝飾品。裝飾物在旋轉的同時反射變化的光線,在四週的牆上投射出彩色圖案。懸掛裝飾物及其影子的表現對實體環境非常敏感,包括門的打開和關閉、空氣調節系統的變化和環境光。這個混亂系統令人著迷且不斷變化的場景會被定期擷取,並輸入到 LavaRand 隨機性串流中。
Cloudflare 奧斯汀辦公室的懸掛彩虹裝飾物。
將新來源混合到 LavaRand 中
我們以與熔岩燈同樣的方式將辦公室混亂的新來源納入 LavaRand 系統(儘管包含的內容遠不止熔岩燈,但仍稱為 LavaRand),這種方式在之前進行了詳細描述。
回顧一下,相機以重複的間隔擷取隨機性表現的當前狀態的影像。由於底層系統是真正隨機的,因此產生的影像包含真正的隨機性。甚至是影子和不斷變化的光照條件也會助力產生獨特且不可預測的效果!我們還應該分享另一個秘密:在基本層面上,現實世界中的影像感應器通常是足夠的雜訊來源,即使在未取下鏡頭蓋的情況下拍攝的影像也可以很好地作為熵來源!我們認為,在這些裝置美妙的混亂運動中,這種增加的雜訊是一種偶然的補充。
Cloudflare 奧斯汀辦公室中懸掛的彩虹裝飾物的特寫。
在擁有了擷取特定時間點隨機性表現狀態的靜態影像後,我們就會計算影像的緊湊表示(雜湊),以得出真正隨機位元組的固定大小輸出。
將實體熵表現轉換為隨機位元組字串的過程。
然後,將該隨機位元組用作_金鑰衍生函數_ (KDF) 的輸入(以及先前的種子和來自系統本地熵來源的一些隨機性),以計算新的隨機性種子,並將其饋送到加密安全偽隨機數產生器 (CSPRNG) 中,可以根據請求產生本質上無窮盡的不可預測位元組串流。CSPRNG 的屬性確保對於不知道其內部狀態的人來說,所有輸出實際上都與真正的隨機輸出無法區分。然後,LavaRand 透過一個簡單的內部 API 公開此隨機性串流,用戶端可以在其中請求新的隨機性。
我如何使用 LavaRand?
seed = KDF(new image || previous seed || system randomness)
rng = CSPRNG(seed)
…
rand1 = rng.random()
rand2 = rng.random()
應用程式通常以兩種方式之一使用安全隨機性:私人和公共。
私人隨機性用於產生密碼、密碼編譯金鑰、使用者 ID 和其他永久保密的值。正如我們之前所說,我們的伺服器定期向 LavaRand 請求新的私人隨機性,以協助更新其熵集區。正因為如此,LavaRand 的隨機性本質上可供外界使用!開發人員利用 LavaRand 私人隨機性的一種簡單方法是使用來自 Cloudflare Worker 的 Web Crypto API 的 getRandomValues 函數,或使用他人已經建立的函數,例如 csprng.xyz(來源)。
公共隨機性由不可預測且無偏見的隨機值組成,這些隨機值發佈後,所有人都可以獲得,因此_不應用於產生密碼編譯金鑰_。一些公共隨機值的執行個體包括中獎的彩票號碼和體育賽事開始時的硬幣投擲。雙面硬幣_不是_一個公正和不可預測的熵來源,而且還會對體育博彩界產生巨大影響。
除了不可預測和公正之外,公共隨機性還應當_值得信賴_,以便隨機性的消費者確信這些值是忠實產生的。如果人們認為中獎彩券的選擇是不正當的,那麼沒有多少人會購買彩券!事實上,腐敗的內部人員為了個人利益而破壞公共隨機性的案例屢見不鮮,例如州立彩票員工就曾操縱彩票隨機數產生器,讓他的朋友和家人贏得了數百萬美元。
公共隨機性的一個基本挑戰是,人們必須信任產生隨機輸出的權威機構。對於許多應用來說,信任像 NIST 這樣的知名權威機構可能已經足夠,但對於其他應用(尤其是對去中心化非常重要的應用)來說,則可能會存在問題。
drand:分散式且可驗證的公共隨機性
為了幫助解決這個信任問題,Cloudflare 早在 2019 年就與其他七個獨立且地理上分散的組織聯手組成了熵聯盟 (League of Entropy),使用 drand(發音為 dee-rand)通訊協定啟動公共隨機性信標。每個組織都將自己獨特的隨機來源貢獻到用於播種 drand 網路的聯合熵集區中——很顯然,Cloudflare 正是使用 LavaRand 的隨機性!
儘管熵聯盟最初只是一個實驗性網路,但在 Protocol Labs 的 drand 團隊的指導和支援下,熵聯盟已發展成一個可靠的、可投入生產的核心網際網路服務,被各種應用廣泛依賴,從分散式檔案儲存和線上遊戲,到時間戳記證明和時間鎖定加密(將在下文進一步討論)。同時,熵聯盟也在不斷發展壯大,目前有來自四大洲的組織加入 drand 網路。
熵聯盟的 drand 信標(每個信標都具有不同的參數,例如隨機值產生的頻率以及隨機性是否_鏈接_——下文將詳細介紹)有兩個可促進其可信度的重要屬性:它們是_去中心化_和_可驗證_的。去中心化確保一兩個壞人無法破壞或偏置隨機性信標,而可驗證性允許任何人檢查隨機值是否是根據 drand 通訊協定產生的,並且有 drand 網路中一定數量(至少一半,但通常更多)的參與者參與。因此,隨著每個新成員的加入,drand 網路的可信度和可靠性不斷提高。
我們在下面簡要概述了 drand 如何使用分散式金鑰產生和閾值簽章來實現這些屬性,但要深入瞭解,請參閱我們之前的部落格文章和 drand 團隊的一些優秀貼文。
分散式金鑰產生與閾值簽章
在 drand 信標的初始設定過程中,網路中的節點執行基於 Pedersen 承諾方案的分散式金鑰產生 (DKG) 通訊協定,其結果是每個節點都持有一個分散式群組金鑰的「一部分」(一個金鑰對),這個金鑰在信標的生命週期內保持固定。要使用群組金鑰執行一些有用的操作(例如簽署訊息),網路中至少要有一定數量(例如 9 個中的 7 個)的節點必須參與建置 BLS 閾值簽章。熵聯盟主網 drand 網路上的 quicknet 信標的群組資訊如下所示:
(上面 URL 中的十六進位值 52db9b... 是信標設定的雜湊值。造訪 https://drand.cloudflare.com/chains 查看我們的主網 drand 節點支援的所有信標。)
curl -s https://drand.cloudflare.com/52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971/info | jq
{
"public_key": "83cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a",
"period": 3,
"genesis_time": 1692803367,
"hash": "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971",
"groupHash": "f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e",
"schemeID": "bls-unchained-g1-rfc9380",
"metadata": {
"beaconID": "quicknet"
}
}
網路中的節點被設定為定期(quicknet 為每 3 秒)協同工作,以針對一些協定的訊息產生簽名,例如當前輪次號碼和上一輪簽章(將在下文進行詳細介紹)。每個節點使用其所持有部分的群組金鑰對當前輪次訊息產生部分簽章,並將其廣播到網路中的其他節點。一旦某個節點擁有足夠的部分簽章,它就可以將它們聚合起來以產生給定輪次的群組簽章。
每個輪次的群組簽章_都_代表隨機性(在上面的輸出中,隨機性值只是簽章的 sha256 雜湊值,適用於喜歡較短、固定大小輸出的應用)。只要 drand 網路中足夠多(至少是大多數,但可以設定為更高)的節點是誠實的並且不串通,簽章就無法提前預測。此外,任何人都可以使用信標的群組公開金鑰來驗證給定輪次的簽章。建議開發人員使用 drand 用戶端庫或 CLI 對從信標取得的每個值執行驗證。
curl -s https://drand.cloudflare.com/52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971/public/13335 | jq
{
"round": 13335,
"randomness": "f4eb2e59448d155b1bc34337f2a4160ac5005429644ba61134779a8b8c6087b6",
"signature": "a38ab268d58c04ce2d22b8317e4b66ecda5fa8841c7215bf7733af8dbaed6c5e7d8d60b77817294a64b891f719bc1b40"
}
鏈式隨機性與非鏈式隨機性
當熵聯盟於 2019 年推出第一代 drand 信標時,計算群組簽章的每輪訊息都包含上一輪的簽章。這會建立一條從第一輪「起源」開始的隨機性鏈。鏈式隨機性為單一來源隨機性信標提供了一些很好的屬性,並已作為一項要求包含在 NIST 的可互通公共隨機性信標規範中。
然而,早在 2022 年,drand 團隊就引進了非鏈式隨機性,其中要簽署的訊息是_可預測的_,並且不依賴前幾輪的任何隨機性,同時證明了它能夠為 drand 網路提供了與鏈式隨機性相同的安全保證(兩者都需要一定數量的誠實節點)。在 quicknet 中實作非鏈式隨機性時,要簽署的訊息僅由輪次號碼組成。
非鏈式隨機性提供了一些強大的屬性,並改進了可用性。在可用性方面,隨機性信標的消費者不需要重建起源輪次的完整隨機性鏈來充分驗證特定輪次——唯一需要的資訊是當前輪次號碼和群組公開金鑰。這為用戶端提供了更大的靈活性,因為它們可以選擇使用隨機性輪次的頻率,而無需持續遵循隨機性鏈。
# chained randomness
signature = group_sign(round || previous_signature)
# unchained randomness
signature = group_sign(round)
由於要簽署的訊息是預先知道的(因為它們就是輪次號碼),非鏈式隨機性還解鎖了一個強大的新屬性:時間鎖定加密。
旋轉雙擺。
時間鎖定加密
時間鎖定(或「定時釋放」)加密是一種對訊息進行加密的方法,需要在經過一定時間後才能解密訊息。Rivest、Shamir 和 Wagner 介紹了兩種基本的時間鎖定加密方法:
- 使用「時間鎖定難題」:電腦需要連續執行至少一定時間才能解決的計算問題。
- 使用值得信賴的代理程式,它們承諾在指定日期之前不會透露某些資訊。
使用值得信賴的代理程式有一個明顯的問題,即如何確保這些代理程式值得信賴。可以使用祕密共管方法來緩解這種擔憂。
drand 網路是一組獨立的代理程式,使用祕密共管來保證可信度,並且在指定日期之前不會透露的「某些資訊」聽起來很像每輪隨機性!接下來我們將描述如何在具有非鏈式隨機性的 drand 網路之上實作時間鎖定加密,並在最後進行實際示範。雖然我們沒有深入研究使這成為可能的雙線性群組和基於配對的密碼學,但如果您有興趣,我們鼓勵您閱讀 Nicolas Gailly、Kelsey Melissaris 和Yolan Romailler 所著的「 tlock: Practical Timelock Encryption from Threshold BLS」(tlock:基於閾值 BLS 的實用時間鎖定加密)。
如何對祕密進行時間鎖定
首先,確定隨機性輪次,在隨機性輪次揭示後,將允許對時間鎖定加密訊息進行解密。一個重要的觀察結果是,由於 drand 網路以固定間隔產生隨機性,因此 drand 信標中的每一輪都與特定時間戳記緊密相關(網路實際產生信標的延遲很小),使用信標的起源時間戳記,加上輪次號碼與信標期間的乘積,即可輕鬆計算出結果。
一旦決定了輪次,雙線性群組的屬性允許您使用 drand 信標的群組公開金鑰將訊息加密到某個輪次。
在 drand 網路中的節點協作得出該輪次的隨機性後(實際上,只是使用信標的群組祕密金鑰對輪次號碼進行簽名),_任何人_都可以解密加密文字(這就是雙線性群的神奇之處)。
為了實現實際應用,時間鎖定訊息實際上是對稱方案的祕密金鑰。這意味著我們使用對稱金鑰加密訊息,並使用時間鎖定加密金鑰,以便在未來對其進行解密。
ciphertext = EncryptToRound(msg, round, beacon_public_key)
現在,為了實際示範時間鎖定加密,我們使用我們自己的工程師在 Cloudflare Workers 之上建立的工具。如果您想深入瞭解它的運作原理,原始程式碼是公開可用的。
random = Randomness(round)
message = Decrypt(ciphertext,random)
後續計劃
我們希望您和我們一樣喜歡重溫 LavaRand 的故事,並受到啟發。期待您未來能親自來到 Cloudflare 的辦公室,親眼見證隨機性展示,並在下一個專案中使用來自 drand 的可驗證公共隨機性和時間鎖定加密。
# 1. Create a file
echo "A message from the past to the future..." > original.txt
# 2. Get the drand round 1 minute into the future (20 rounds)
BEACON="52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
ROUND=$(curl "https://drand.cloudflare.com/$BEACON/public/latest" | jq ".round+20")
# 3. Encrypt and require that round number
curl -X POST --data-binary @original.txt --output encrypted.pem https://tlock-worker.crypto-team.workers.dev/encrypt/$ROUND
# 4. Try to decrypt it (and only succeed 20 rounds x 3s later)
curl -X POST --data-binary @encrypted.pem --fail --show-error https://tlock-worker.crypto-team.workers.dev/decrypt
確保網際網路安全的加密需要混亂。在增加了新的來源之後,Cloudflare 的 LavaRand 仍會繼續將我們實體世界的混亂之美轉化為隨機性串流,為我們所有探索者提供新穎用途,就像那隻蝸牛一樣,可能性是無限的。
她凝視著天空、大海、陸地、海浪、洞穴和金色的沙灘。她凝視著,對這一切感到驚歎不已。她對鯨魚說:「我感到如此渺小。」
鯨魚身上的蝸牛。
請關注更多新聞、公告與發人深省的討論!別錯過完整的 Security Week 中心頁面。