すべてのhabrozhitelへのご挨拶! この記事では、キーファイルとして使用されるUSBドライブを使用した暗号化されたコンテナの自動接続に関するベストプラクティスを紹介します。
私の仕事の詳細のため、暗号化されたコンテナを使用する必要があります。これらの目的のために、すべての人にTrueCryptと呼ばれる有名なツールを選択しました。
私の場合、暗号化されたコンテナは、ドライブ文字、キーファイルを選択し、正しいパスワードを入力した後に接続されます。これはすべて、TrueCrypt自体のGUIインターフェイスを介して行われます。 この方法のマイナス面は文字通りすぐに感じました。接続に多くの時間が失われ、職場を離れるたびにコンテナを切断する必要があり、戻ったときに同じルーチン操作を再度実行します。 そして、一日に数回。 約1か月これを我慢し、アイデアが浮上しました-接続されたUSBドライブを使用して自動的に暗号化されたコンテナーを接続することです。
さまざまなトークン/ルートトークンは考慮されず、キーファイルとして機能する接続されたUSBドライブを使用してコンテナを接続することが決定されました。
最終的に何が起こらなければならなかったか:
1.もちろん、これらすべてのソフトウェア開発。
2.プログラムは常にRAM内にあり、有効なUSBドライブがあるかどうかUSBデバイスを確認する必要があります。
3.有効なUSBドライブは、事前に暗号化されたコンテナに関連付けられています。
4.接続されたUSBドライブが有効であると考えられる場合、それ以上の質問などはありません。 暗号化されたコンテナが接続されています。
5.接続されたUSBドライブを取り外すと、暗号化されたコンテナは切断されます。
この問題を解決するために、AutoITプログラミング言語が選択されました。
何がすべての原因:
予想通りになりました。 ポイントごとにみましょう:
1.コンフィギュレーターを要件に合わせて構成します。
$flash = "E:" ; USB ,
$passwd = "Pa$$w0rd" ;
$path = "c:\windows\storage.tc" ;
$mount = "R:" ;
$key = "0x1234Af3d21" ; , . , .
コンフィギュレーターのソースコード。
#include <md5.au3> ; md5
#include <string.au3> ;
AutoItSetOption ("TrayIconHide", 1 ) ;
AutoItSetOption ("TrayIconDebug", 1 ) ;
$flash = "E:" ;
$passwd = "Pa$$w0rd" ; TrueCrypt
$path = "c:\windows\storage.tc" ;
$mount = "R:" ;
$key = "0x1234Af3d21" ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; RC4
; MD5+RC4
$a = _StringEncrypt(1, md5(DriveGetSerial( $flash )),$key,2)
$b = _StringEncrypt(1, $passwd,$key,2)
$c = _StringEncrypt(1, $mount,$key,2)
$d = _StringEncrypt(1, $flash,$key,2)
$e = _StringEncrypt(1, $path,$key,2)
RegWrite("HKCU\Software\USBToken", "Serial", "REG_SZ", $a)
RegWrite("HKCU\Software\USBToken", "Master", "REG_SZ", $b)
RegWrite("HKCU\Software\USBToken", "Mount", "REG_SZ", $c)
RegWrite("HKCU\Software\USBToken", "Flash", "REG_SZ", $d)
RegWrite("HKCU\Software\USBToken", "Path", "REG_SZ", $e)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; C -
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$file = FileOpen("master.key", 2)
FileWrite ($file, _StringEncrypt(1,$a & $b & $c & $d & $e & @ComputerName & @UserName, $key,2))
FileClose($file)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2.このビジネスを開始すると、コンフィギュレーターは必要な値を暗号化形式でレジストリブランチHKCU \ Software \ USBToken(pr索好きな目から)に書き込み、入力されたデータに基づいて、コンフィギュレーターと共にフォルダーにキーファイルが作成されます。 このキーファイル(master.key)を使用して、新しい(または古い構成の)コンテナー+パスワードを作成します。この場合は、値(Pa $$ w0rd)を持つパラメーター$ passwdです。
3.最後に、コンフィギュレーターが作成したキーファイルを示すパスワードPa $$ w0rd +を入力すると接続するコンテナーを取得する必要があります。 すべての操作が完了したら、キーファイルを削除します。 次に、バトンをメインプログラムに渡します。
4.メインプログラムは常にRAMにあり、5秒ごとに接続されたUSBデバイスをチェックします。有効なUSBドライブが接続されている場合、プログラムはユーザーの一時フォルダーにキーファイルを生成し、暗号化されたコンテナーを接続し、キーファイルを削除します。
5.有効なUSBドライブを取り外すと、暗号化されたコンテナーは切断されます。
メインプログラムを設定します。
$key = "0x1234Af3d21" ; , -
$truecrypt = "C:\Program Files\TrueCrypt\TrueCrypt.exe" ; TrueCryp
$key = "0x1234Af3d21" ; , -
$truecrypt = "C:\Program Files\TrueCrypt\TrueCrypt.exe" ; TrueCryp
t
$key = "0x1234Af3d21" ; , -
$truecrypt = "C:\Program Files\TrueCrypt\TrueCrypt.exe" ; TrueCryp
メインプログラムのソースコード。
#include <md5.au3> ; md5
#include <constants.au3>
#include <string.au3>
If WinExists(@ScriptName) Then Exit ;
AutoItWinSetTitle(@ScriptName)
AutoItSetOption ("TrayIconHide", 1 ) ;
AutoItSetOption ("TrayIconDebug", 1 )
$key = "0x1234Af3d21" ; , -
$truecrypt = "C:\Program Files\TrueCrypt\TrueCrypt.exe" ; TrueCrypt
$drive = BinaryToString(_StringEncrypt(0,RegRead("HKCU\Software\USBToken","Flash"),$key,2))
$serial = _StringEncrypt(0,RegRead("HKCU\Software\USBToken","Serial"),$key,2)
$passwd = BinaryToString(_StringEncrypt(0,RegRead("HKCU\Software\USBToken","Master"),$key,2))
$path = BinaryToString(_StringEncrypt(0,RegRead("HKCU\Software\USBToken","Path"),$key,2))
$mount = _StringEncrypt(0,RegRead("HKCU\Software\USBToken","Mount"),$key,2)
While 1
if DriveStatus($drive) <> "READY" OR md5(DriveGetSerial($drive)) <> $serial AND DriveStatus($mount) = "READY" then
Run($truecrypt & ' /f /q /d ' & $mount)
endif
if DriveStatus($drive) = "READY" AND md5(DriveGetSerial($drive)) = $serial AND DriveStatus($mount) <> "READY" then
$file = FileOpen(@TempDir & "\master.key", 2)
FileWrite ($file, _StringEncrypt(1,RegRead("HKCU\Software\USBToken","Serial") & RegRead("HKCU\Software\USBToken","Master") & RegRead("HKCU\Software\USBToken","Mount") & RegRead("HKCU\Software\USBToken","Flash") & RegRead("HKCU\Software\USBToken","Path") & @ComputerName & @UserName, $key,2))
FileClose($file)
Run($truecrypt & ' /a /q /s /b /v ' & $path & " /l " & $mount & " /k " & @TempDir & "\master.key" & " /p " & $passwd)
Sleep(2000)
FileDelete(@TempDir & "\master.key")
else
endif
Sleep(5000)
WEnd
結論:
1. USBドライブの有効性は、USBドライブのシリアル番号のハッシュによって検証されます。
2.レジストリ内のすべてのデータは、RC4アルゴリズムを使用するキーを使用して暗号化されます。
3.キーファイルはプログラム自体にのみ保存され、接続されたUSBドライブが接続された後にのみ生成され、その後すぐに削除されます。
4.有効なUSBドライブを削除すると、暗号化されたコンテナは/ forceオプションで無効になります。
5.追加のウィンドウや質問はありません。すべてが透明です。
この方法は確かに革新的ではありませんが、生きる権利があります。 このような根本的な方法でこの問題を解決することは、ドアをノックすることに驚いた人には適さないでしょうが、普通の日常のユーザーにはまったく受け入れられます。 これを必要とする人は誰でも簡単にプログラムを設定でき、必要に応じてオートロードや好きなものをすべて追加できます。 パフォーマンスはXPおよびWin7でテストされました。 達成したかったすべてのことを達成しました。
プラスがある場合、欠点もあります。 そして、これは(暗号化された形式ではあるが)レジストリ内のデータストレージであり、キーファイルはハードドライブ上のプログラムによって生成され、その後削除されます。 顔の事実。
だからこの機会に私はコメントを引用したいroman_pro
間違い#1: RC4ストリームアルゴリズムが同じキーで複数回使用されています。 誰かが知らない場合-簡単な教育プログラム-RC4はキーに基づいて擬似ランダムガンマを生成し、XORを使用して暗号化されたデータに重ね合わせます。 復号化も同様です。 同じキーが異なるデータに2回使用される場合、暗号化されたデータに対してXOR操作を実行すると、キーの影響を受けずにデータが相互にXOR交換されるストリームが取得されます。 何らかの理由で、オープンデータとその暗号化バージョンを認識している場合、ガンマを計算し、それを使用して残りのデータを復号化するのは簡単です。 この場合の予測データは、Mount、Flash、およびPathです。 さらに、パスがマスターよりも長いことが判明した場合(つまり、パスワードがコンテナーへのパスよりも短い場合)、パスから抽出されたガンマを使用して、マスターを復号化することが可能になります。 結論:同じキーでRC4を1回以上使用しないでください。
間違い2:フラッシュドライブのシリアル番号へのバインドは、実際にはボリュームのシリアル番号へのバインドです。 これはAutoItのドキュメントで明確に述べられており、これはよくある誤解です。 デバイスのシリアル番号はデバイスに配線されており、フォーマット中に変更されることはありません。 ボリュームシリアル番号はフォーマット中に変更され、簡単に変更できます。 結論:ボリュームではなく、鉄のシリアル番号を取得する必要があります。 ボリュームのシリアル番号が変更されたためにUSBフラッシュドライブをフォーマットすると、コンテナへのアクセスが失われます。 ただし、すべてがそれほど怖いわけではありません。次の段落を参照してください。
間違い3:ボリュームのシリアル番号には実際にはバインドがありません。シリアルからのmd5とレジストリに以前に保存されたものとの簡単な比較がありますが、間違ったシリアルは正しいキーの生成を妨げません。キーを生成するためのすべてのデータはレジストリから取得されます 比較にパッチを当てるだけで十分であり、プログラムはキーフラッシュドライブがなくても正しいキーをスタンプします。 結論:フラッシュドライブから読み取られたシリアル番号は、レジストリから以前に保存されたコピーではなく、正しいキーの生成に直接関与する必要があります。
エラー番号4:キーは一時フォルダー内のディスクにフラッシュされ、削除されます。 現在のユーザーとキーから%TEMP%フォルダーを削除する権利を選択するだけで十分です。 削除されたファイルの回復について-私は黙っています。 「キーフラッシュドライブ」があるときに、ハードドライブにキーをダンプしたいという気持ちがわからない。 キーを保存する方がはるかに論理的ですが、コンピューターのディスクにキーの痕跡はありません。 しかし、彼らが言うように、マスターはマスターです。
要約すると、このトピックは、セキュリティを自分の手でつぼみに埋め、古典的な不明瞭さに置き換える方法についての美しい物語です。 この場合TrueCryptがまったく明確ではない理由。 コンテナーを開くためのほとんどすべてのデータはレジストリと実行中のプログラムにあります。フラッシュドライブは、古典的なif(password ==“ mycoolpassword”)チェックの美しいおもちゃにすぎません。
プログラムはAutoitで作成され、サードパーティライブラリmd5.au3が使用されました。これはProgram Files \ Autoit3 \ Includeフォルダーに配置する必要があります( ここからダウンロードできます)。 ご清聴ありがとうございました! 最高!