Libsodium Crypto Boxes 的安全性如何?
我目前正在處理一個巨大的 PHP 項目,我們正在認真考慮在其中使用 Libsodium PHP 庫。
我的問題與“鈉加密盒”功能有關。我們將使用此功能來實現公鑰認證加密。我們將使用“sodium crypto box keypair”功能生成密鑰對,使用“sodium crypto box noncebytes”功能生成隨機數,並通過“sodium crypto box”和“sodium crypto box open”功能密封/打開密碼盒。
我的問題基本上是“這有多安全”?
公鑰將是公開的,所以我們擔心有人可能能夠通過“破解”發送者的密鑰來生成正確密封的盒子,或者通過破解接收者的 SK 來打開一個密封的盒子。這些鍵是 64 位十六進製字元串。我的假設是否正確,這意味著有 16^64?
如果是,這意味著以每秒 100 萬次嘗試的速度強制所有可能的組合將需要 3.6717430630808 * 10^63 年?還是有更“有效”的攻擊?
在官方 Libsodium 網站上,我找到了以下關於我們要使用的函式的算法細節:
密鑰交換:X25519
加密:XSalsa20 流密碼
認證:Poly1305 MAC
有人可以嘗試向我解釋這意味著什麼嗎?以下解釋是否正確:
- X25519:這是密鑰對生成算法?
- XSalsa20:這是加密算法?
- Poly1305:這是nonce生成算法?
您可以將 crypto_box_curve25519xsalsa20poly1305 視為 X25519(一種密鑰協商方案)的組合;XSalsa20,一種對稱密鑰流密碼;Poly1305,一次性多項式評估消息認證碼。但是,當您從中設計某些東西時,這並不是考慮它的最佳方式——部分原因是您可以通過多種方式組合它們,但主要是因為它不能幫助您弄清楚它如何適合您的應用程序。
相反,您應該將其視為一份契約,由您承擔義務,由 crypto_box_curve25519xsalsa20poly1305 承擔安全服務:
- 您對 crypto_box_curve25519xsalsa20poly1305 的義務。
(a) 您必須隨機生成一個統一的密鑰。
(b) 您必須為使用該密鑰的每個公鑰和消息選擇一個不同的隨機數。如果您願意,您可以隨機均勻地生成它們。 2. 由 crypto_box_curve25519xsalsa20poly1305 提供的安全性,即使面對可以攔截網路上的每個盒子並說服合法使用者自適應地為他們選擇的任意消息創建盒子的對手。
(a) 任何不知道發送者和接收者的兩個密鑰之一的人都不能打開內容尚不知道的盒子。
(b) 任何不知道發送者和接收者的兩個密鑰之一的人不能偽造不是由發送者或接收者創建的盒子。
crypto_box_curve25519xsalsa20poly1305 不提供第三方可驗證性,在某些圈子中也稱為不可否認性:如果 Alice 向 Bob 發送一個盒子,Bob 不能在不向 Charlie 展示偽造 Alice 的能力的情況下以**密碼方式說服 Charlie Alice 發送了該消息 $ \rightarrow $ 鮑勃消息。
這在“安全模型”下的NaCl crypto_box 文件中以稍微更學術的細節進行了說明。
攻擊成本。 crypto_box_curve25519xsalsa20poly1305 旨在針對“128 位安全級別”,這意味著最知名的攻擊的面積*時間成本(矽晶片上的面積乘以您為其供電所花費的時間)約為 $ 2^{128} $ 位操作,這比我們想像的任何人都做過。
crypto_box_curve25519xsalsa20poly1305 的密鑰確實是 256 位長,但是 X25519 中有足夠的數學結構來承認攻擊比簡單地列舉和嘗試所有可能的密鑰更便宜 - 便宜得多,以至於你希望得到最好的橢圓曲線一個 256 位的欄位是一個 128 位的安全級別。您可以在SafeCurves的“ECDLP 安全性”下找到有關這些攻擊的高度技術參考資料。
crypto_secretbox_xsalsa20poly1305的秘密密鑰是一種建構 crypto_box_curve25519xsalsa20poly1305的操作,也是 256 位長,但秘密盒的對象的性質允許多目標攻擊,其中最知名的區域 * 破解時間成本為一組中的至少一個 $ n $ 目標 $ k $ -具有不可忽略機率的位密鑰顯著小於 $ 2^k $ . 為 crypto_secretbox 使用 256 位密鑰可以保證即使是對於一個難以想像的大集合 $ 2^{128} $ 目標,以不可忽略的機率破壞至少一個目標的最廣為人知的面積*時間成本仍然超過 $ 2^{128} $ 位操作。