我應該在我的應用程序中使用 NaCl 還是 libsodium?
在為我的應用程序使用者尋找端到端加密時,我偶然發現了NaCl和libsodium。從安全的角度來看,我不確定我應該將哪些實現用於我的跨平台應用程序。
它們提供的安全級別是否存在很大差異?
(我對 NaCl 沒有意見,因為我從未使用過它。我的理解是 Libsodium 部分使用 NaCl,和/或在其他部分重新實現它。)
就安全性而言,它們應該同樣安全。據我所知,他們都固執己見,因為他們沒有為您提供使用不太安全的技術的選項。在您尋找的幾乎每個密碼原語中,您只會找到一兩個更新且更安全的(即最佳實踐)。此連結詳細說明了一些設計決策:
https://libsodium.gitbook.io/doc/internals#security-first
這是來自 Paragon 的關於 Libsodium 的一個很好的資源——如果你使用的是 PHP,你無疑會在這裡結束,因為標準的 doco 是一大堆“待辦事項”:
https://paragonie.com/book/pecl-libsodium
您無需指定語言,但是,我已經在眾多 Linux 核心中成功使用了 Libsodium,包括 PHP、Python (pysodium)、Javascript、Windows 8.1+ 和 Android 7+(通過 Termux)。我還將 pysodium 中的某些原語與另一個名為 cryptography.io(依賴於 OpenSSL)的 Python 庫進行了互換。
我喜歡的一件事是該庫在許多情況下提供兩個介面的方式:一個“通用命名”函式和一個明確命名的函式。例如,您可以呼叫
crypto_aead_xchacha20poly1305_ietf_encrypt
which 顯式定義正在使用的密碼,或者,crypto_secretbox
如果出現修改預設行為的更新版本,您可以呼叫並允許您的密碼系統在未來“升級”。到目前為止,我發現的一個缺點是,至少對於 pysodium 使用這個庫來說,Argon2id 的 api 暴露不支持關聯數據,而庫中的實際算法程式碼庫支持:
- https://github.com/jedisct1/libsodium/blob/927dfe8e2eaa86160d3ba12a7e3258fbc322909c/src/libsodium/crypto_pwhash/argon2/pwhash_argon2id.c#L136
- https://github.com/jedisct1/libsodium/blob/a97ab7085fcda73f4fc7dead1a499025ceda9ecc/src/libsodium/crypto_pwhash/argon2/argon2-core.c#L470
實際上,這不是問題,因為我只是用密碼對關聯數據進行了雜湊處理 - 但是,這在某些實現中可能是一個問題,特別是如果您正在與另一個庫並行生成 PBKDF,以便您可以交換數據(例如在端到端協議中)。如果您使用的是 Python,則可以
argon2-cffi
在大多數情況下使用該實現。AES-ECB 和 AES-CBC 密碼的缺乏使我無法在一個 MySQL 集成項目中專門使用 Libsodium,但是,在這種情況下使用 cryptography.io 作為橋樑並不是什麼戲劇性的事情。這就是我開始研究 Libsodium 和 OpenSSL 之間兼容性的方式(通過 pysodium 和 cryptography.io)。