0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

暗号化ブラウザラッパー「EncBrowse」:Avalonia UI開発ログ

0
Posted at

はじめに

Avalonia UIの学習プロジェクトとして開発していたファイル暗号化ツールを、 「暗号化されたHTMLや画像をブラウザで安全に閲覧するラッパー」 としてブラッシュアップしました。 「アプリ内で表示する」から「ブラウザに任せる」へと発想を転換した経緯と、その技術仕様・実装のポイントをまとめます。

開発の背景と目的

当初は「画像を暗号化してアプリ内で表示する」ツールでしたが、開発を進める中で以下の課題が出てきました。

  • 対応フォーマットの限界: 画像だけでなく、HTMLやPDF、動画なども扱いたい。
  • レンダリングのコスト: アプリ内でHTMLレンダリングエンジンを実装・維持するのはコストが高い。

そこで、アプリ自体は 「復号と起動」に徹し、表示は高機能な「既定のブラウザ(またはOSの関連付けアプリ)」に任せるというラッパー方式 を採用しました。

システムの挙動(EncBrowse)

このツールは、管理者(暗号化する人)とユーザー(閲覧する人)の利用を想定しています。

暗号化 (管理者):

  • 任意のファイル(HTML, JS, PNG等)をパスワード付きで暗号化。
  • 独自形式 .secure ファイルとして保存。
  • 複数ファイルの一括暗号化にも対応。

復号と閲覧 (ユーザー):

  • パスワードを入力して .secure ファイルを選択。
  • アプリが復号し、ランダムなファイル名で一時ファイルを作成。
  • 自動的に既定のブラウザが起動し、ファイルが表示される。
  • アプリ終了時に一時ファイルを自動削除し、痕跡を消す。

技術仕様

セキュリティツールとして実用的な強度を持たせるため、以下の標準技術を採用しています。

  • フレームワーク: .NET 8 / Avalonia UI 11
  • 暗号化アルゴリズム: AES-256 (CBCモード)
  • 鍵導出: PBKDF2 (SHA-256, 10,000回反復)
  • Salt/IV: ファイルごとにランダム生成してヘッダに埋め込み

ファイル構造

復号に必要な情報はファイルヘッダに平文で持ち、データ本体のみを暗号化しています。

[ Salt (16B) ] + [ IV (16B) ] + [ Encrypted Data (MIME + Content) ]
4. 実装のポイント (C#)
運用モードの切り替え(管理者/ユーザー)
誤操作を防ぐため、コード内のフラグ一つで「暗号化機能(管理者用)」を非表示にできる仕組みを導入しました。配布用ビルドを作成する際に便利です。
MainWindowViewModel.cs
// MainWindowViewModel.cs
// 運用設定: trueなら管理者用(暗号化あり)、falseならユーザー用(復号のみ)
public bool IsEncryptionVisible { get; } = true; 
View側では IsVisible にバインドするだけで制御できます。
MainWindow.axaml
<!-- MainWindow.axaml -->
<Button Content="Select &amp; Encrypt File" 
        Command="{Binding EncryptCommand}"
        IsVisible="{Binding IsEncryptionVisible}"/>

一時ファイルの自動削除

ブラウザで表示するために一時ファイルを作成しますが、セキュリティリスクを低減するため、アプリ終了時にこれらを削除する処理を実装しています。

MainWindowViewModel.cs
// MainWindowViewModel.cs
public MainWindowViewModel()
{
    // ... コマンド初期化など
    AppDomain.CurrentDomain.ProcessExit += (s, e) => CleanupTempFiles();
}

private void CleanupTempFiles()
{
    foreach (var path in _tempFilePaths)
    {
        try
        {
            if (File.Exists(path)) File.Delete(path);
        }
        catch { /* 削除失敗時は無視 */ }
    }
}

既定のブラウザで開く

.NET の Process.Start を使用し、シェル実行 (UseShellExecute = true) を有効にすることで、拡張子に関連付けられた既定のアプリケーション(HTMLならブラウザ、PDFならPDFリーダー)で開くことができます。

// 復号後の処理
Process.Start(new ProcessStartInfo { 
    FileName = tempFilePath, 
    UseShellExecute = true 
});

まとめ

Avalonia UIを使うことで、Windows/macOS/Linuxで動作するセキュリティツールをクロスプラットフォームで実装できました。 「ブラウザラッパー」というアプローチにより、HTMLベースのリッチなコンテンツも安全に配布・閲覧できる、汎用性の高いツールになりました。

今後は、WebView2を用いたアプリ内表示(完全なファイルレス化)なども検討していきたいです

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?