Ad Nihilum 0.4.3がリリースされました。これは、「読んで捨てる」という原則に基づいた、ミニマルで自己ホスト型の暗号化メッセージングサービスです。
サーバーは、単なるサイレントストレージデバイスとして機能します。暗号化と復号化は、クライアント側のブラウザでのみ行われます(AES-GCMを使用)。
特長
- ローカルでの暗号化と復号化が行われ、サーバーは鍵を一切見ることがない。
- (1)サーバーが知ることができない、(2)送信されたリンクから見つけることができない、追加のパスワード暗号化レイヤーのサポート。
- このプロジェクトには、C言語で書かれた約2200行のサーバーコードと、JavaScriptで書かれた約600行のクライアントコードが含まれており、監査が容易になっています。
- Ad Nihilumはlibmicrohttpdのみに依存しています。QRコードを生成するために、QRCode.jsの修正版が提供されています。
- 外部IPアドレスを使用せずにローカルサービスを迅速にセットアップするための手順が付属しています。
- Ad Nihilumは AndroidTermuxでのアセンブリに対応するスクリプトが添付されています。
- シングルスレッドかつ同期型のサーバー。
変更点
大規模な再設計
- メッセージの送受信を行うページと、それに対応するクライアントコードは分離されています。
- 概して、デザインはローチャン家の要望を考慮して大幅に変更・調整された。
- 「シンプル」で地元の顧客:
- クライアントページはローカルに保存して、file:// から使用できます。
ブラウザポリシー
- CSPはXSS対策として導入されました。
- サーバーはHSTSを送信します。
その他の変更
- このプロジェクトはEpha-otsから名称変更された。
- ドメインadnihilum.netを購入。
- TLSはLet's Encryptを使用して提供されています。この点は覚えておくと良いでしょう(費用は一切かかりません)。
- ファイル操作が簡素化されました。
- ファットポインターへの移行。
- 軽微なバグを修正しました。
- CMake を介してビルドする際に、クライアントファイルを自動で jsminify およびビルドします。
プロトコルの概要
3つのランダムな値を生成します:キー K初期化ベクトル N そして塩 S. K — 256ビット、 N — 96ビット、 S — 128ビット。
取り下げます ID の K и S SHA-256ベースのHKDFを使用します。
追加の認証済みデータ文字列を生成する アード - id=ID のような文字列です
ユーザーがパスワードを設定している場合:
- 撤退する Pk パスワードから S PBKDF2、SHA-256、800000回の反復処理を使用。
- あらゆる料理に同じ塩が使われる。
- 指定された鍵を使用してAES-GCMでデータを暗号化します。 PkIV/nonce N そして受け継いでいく アード.
パスワードが設定されていた場合は、既に暗号化されたデータに2バイトのタグを追加し、パスワードが設定されていなかった場合は、元のデータにタグを追加する。
最初のバイトは重要です。データがパスワードで暗号化されているかどうかを示します。
- 0x73 - データはパスワードで暗号化されています。
- 0x13 - データはパスワードで暗号化されていません。
2バイト目は定数値0x37です。
同じ iv = N と同じ AES-GCM を使用して結果を再度暗号化します。 アードこれで最終的な暗号文が得られます。 ct.
バイト列を文字列に連結する: blob = N .. S .. ct
送信します ブロブ サーバーに一緒に IDサーバーは返します ブロブ それが理由です ID そして交換できません: クライアントはまず確認します ID を使用して N и K 復号化前でさえ、そしてその後 - アード.
クライアントストア K. K サーバーには決して送信されません。 Pk パスワードも送信されません。パスワードに関連するすべての情報はメモリから消去されます。
クライアントはリンクを生成します: origin/#ID/K
それは ID и K — base64url形式の文字列。
受信者がリンクを開くと:
- ブラウザは「#」で始まるすべてのデータを破棄します。これはlocation.hashと呼ばれます。
- クライアントアプリケーションはサーバーからダウンロードされます。
- 私の意見では、これが主な問題点です。つまり、私たちは再び「TLSには脆弱性がある」という事実に直面しているのです。
- ただし、クライアントをオフラインで保存することを妨げるものはありません。
- 理想的には、独立したスタンドアロンのクライアントを用意すべきだ。
クライアント側のJavaScriptはlocation.hashをチェックし、それが存在するかどうかを確認します ID и Kサーバーからデータをダウンロードします。
次に、それらを検証し、復号化し、必要に応じてパスワードを要求し、再度復号化します。
ライセンス
このプロジェクトはGPLv3ライセンスの下で配布されています。
出所: linux.org.ru
