3

一部のファイルをメモリに復号化して、ハードディスクを使用せずに通常のファイルとして使用できますか?

より正確には、機密データを含む .mdb ファイルを復号化し、一時ファイルを使用せずに、ディスクからロードしたように操作したいと考えています。復号化されたバイト配列から File オブジェクトまたはストリーム (コードを理解する必要があります) を実行できるのではないかと考えましたが、問題は、OleDbConnection がファイル名を含む文字列からデータをロードすることです。

これを例にしてみましょう:

byte[] someArrayWithTheContentsOfAdotMDBFile = getDecryptedFile();

[...]

// 配列をファイルまたはストリームにラップしたとしても、ロード プロセスにはファイル名が必要です

using (OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\"+ fileNameHere)) // can fileNameHere  be a File object, stream or any trick like that??

編集:答えがそのようにスレッドを受け取ったので、タイトルを「データベースの読み込み中...」に変更しました。任意のファイル タイプをメモリからロードすることにまだ関心がありますが、それは別のスレッドに任せましょう。

4

4 に答える 4

3

私はアクセスがそれを行うことができるとは思わない...

ただし、次の設定を使用して目標を達成します。

  • SQLite
    を使用 インメモリ (純粋な RAM) をストレージとして使用し、その上で操作できます

  • 転送メカニズム(ファイル)として暗号化された「SQLite-Dump」(つまり、バックアップ)を使用します。
    操作が必要な場合は、メモリにロードし、復号化し、空の「SQLite インメモリ インスタンス」を作成して「復元」します。復号化されたストリームから

注意:
SQLite などの一部の DB エンジンでは、求めるスキームが可能ですが、ファイルを復号化する必要があるため、アプリケーションには復号化に必要なキーが含まれている必要があります。
これは、誰かがあなたの DB ファイルを読みたい場合、最初にアプリケーションを分析し、復号化キーなどを回復することで可能になることを意味します。
「対称暗号化」(AES など) を使用すると、アプリケーションが気付かずに DB ファイルを変更することさえできます。 .
「非対称暗号化」(RSA など) を使用している場合でも、それを読み取ることはできますが、DB ファイルを変更することはできません。

セキュリティに関する 1 つの重要なポイント: 100% 制御できないマシン上で実行されるものはすべて「クラック」される可能性があります。

于 2012-12-15T00:22:52.950 に答える
2

Have you considered using SQL Server Compact with database encryption?

SQL Server Compact is a file-based database, not server-based, which as you said in a comment is preferable for you.

The file on disk is encrypted. It is decrypted in memory, decrypted data is not stored to disk.

It's extremely simple to work with - you just need to put the password in the connection string when you open a connection to the database.

Seems this would fit your use case.


An aside on Password/Key management: Yeah, thanks Alexei, I was hoping nobody would mention that one. :-) It's a tough problem, especially if we're talking about an application that is distributed to the people who you want to protect the database from.

Ultimately, it can't be done. If your application can open the database, and you distribute your application, an attacker can reverse-engineer your application and figure out how to open the database. .NET apps are of course particularly easy to decompile.

The way I see it, you can either just put the key in the code, and accept that anyone who decompiles the code will find it; or you can try to make efforts to obfuscate it (break up the key into various places in the code, write ugly complicated code to reconstruct it, etc.) If you do that, it will still be breakable - you'll just raise the bar from "anyone who decompiles the code" to "anyone who decompiles the code and is willing to spend the time & effort working through your obfuscation".

于 2012-12-15T00:11:15.513 に答える
1

何かにファイル名が必要な場合、一般に公開されているファイル (ディスク上の通常のファイル、RAM ディスク、またはその他の種類のデバイス) を回避することはできません。

あなたが試すことができます:

  • ファイルのセキュリティを構成して、現在のユーザーのみがファイルを開くことができるようにします
  • 終了時に削除フラグを使用して一時ファイルを作成することを検討してください。
  • インメモリストレージから動作できる別の DB エンジンを見つけてください。

補足: なぜこのルートに行こうとしているのかを慎重に考える必要があります。作成しようとしている制限が、問題を解決していないか、ユーザーを考慮して完全にやり過ぎであることが判明する場合があります。

于 2012-12-15T00:00:32.590 に答える
0

メモリマップトファイルがここでの答えのようです:)

http://blogs.msdn.com/b/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx

また

http://www.codeproject.com/Articles/138290/Programming-Memory-Mapped-Files-with-the-NET-Frame

于 2012-12-15T00:25:12.857 に答える