Ad Nihilum 0.4.3 已發布——這是一個基於「讀取並銷毀」原則的極簡主義、自託管、加密訊息服務。
伺服器僅充當靜默儲存設備。加密和解密完全在客戶端瀏覽器中進行(使用 AES-GCM 演算法)。
特點
- 本地加密和解密,伺服器永遠不會看到金鑰;
- 支援增加一層密碼加密,該加密層(1)伺服器無法知道,(2)無法從傳輸的連結中發現;
- 此專案包含約 2200 行 C 語言伺服器程式碼和 600 行 JS 用戶端程式碼,這簡化了審計工作;
- Ad Nihilum 僅依賴 libmicrohttpd。它提供了一個修改版的 QRCode.js 用於產生二維碼;
- 本文檔包含無需外部 IP 位址即可快速設定本機服務的說明;
- Ad Nihilum 的作品 Android隨附用於在 Termux 中彙編的相應腳本;
- 單線程同步伺服器。
變化
大規模重新設計
- 發送和接收訊息的頁面以及對應的客戶端程式碼是分開的。
- 總的來說,設計方案根據洛爾坎人的意願進行了大幅修改和調整。
- “簡單”的本地客戶:
- 客戶端頁面可以儲存到本機,並透過 file:// 使用。
瀏覽器策略
- 已實施 CSP 來對抗 XSS;
- 伺服器發送 HSTS。
其他變化
- 此專案由 Epha-ots 更名而來;
- 已購買網域 adnihilum.net;
- TLS 使用 Let's Encrypt 提供,這一點值得注意(不涉及金錢交易);
- 文件操作已簡化;
- 過渡到粗指針;
- 修復了一些小錯誤;
- 使用 CMake 建置時,自動進行 js 檔案壓縮並建置客戶端檔案。
協議概述
產生三個隨機值:鍵 K初始化向量 N 和鹽 S. K — 256 位, N — 96 位, S — 128 位元。
撤 ID 的 K и S 使用基於 SHA-256 的 HKDF。
產生一串額外的已驗證數據 AAD 它只是一個類似這樣的字串:id=ID
如果用戶已設定密碼:
- 撤 Pk 從密碼和 S 使用 PBKDF2、SHA-256、800000 次迭代;
- 所有東西都用同一種鹽;
- 使用金鑰透過 AES-GCM 加密數據 Pk,IV/隨機 N 並傳下去 AAD.
如果資料中包含密碼,則在已加密的資料中新增一個兩位元組的標籤;如果沒有密碼,則會在原始資料中新增一個兩位元組的標籤。
第一個位元組很重要:它指示資料是否使用密碼加密:
- 0x73 - 資料已使用密碼加密;
- 0x13 - 資料未使用密碼加密。
第二個位元組是常數值 0x37。
使用相同的初始化向量 (iv) = N 和相同的參數,透過 AES-GCM 再次加密結果。 AAD這樣就得到了最終的密文。 ct.
將位元組連接成字串:blob = N .. S .. ct
送 BLOB 到伺服器以及 ID伺服器回 BLOB 這就是原因 ID 且無法替換:客戶會先檢查 ID 同 N и K 甚至在解密之前,然後——透過 AAD.
客戶儲存 K. K 永遠不會發送到伺服器。 Pk 密碼也不會被傳送;所有與密碼相關的資訊都會從記憶體中清除。
客戶端產生連結:origin/#ID/K
這裡 ID и K — base64url 格式的字串。
當收件者開啟連結時:
- 瀏覽器會丟棄所有以#開頭的內容;這稱為location.hash;
- 客戶端應用程式從伺服器下載;
- 在我看來,這就是主要漏洞:我們本質上又一次遇到了「TLS 存在漏洞」這一事實;
- 但是,您可以離線儲存用戶端;
- 理想情況下,應該有一個獨立的客戶端。
客戶端 JavaScript 會檢查 location.hash 文件,並判斷它是否存在。 ID и K它從伺服器下載資料。
然後它會檢查它們,解密它們,如有必要,會要求輸入密碼並再次解密它們。
許可證
該項目以 GPLv3 協議發布。
來源: linux.org.ru
