32

ユーザーのメールボックスのストレージクォータを照会するために作成していたwinformsアプリに、このようなコードがあります。

DirectoryEntry mbstore = new DirectoryEntry(
      @"LDAP://" + strhome, 
      m_serviceaccount, 
      [m_pwd], 
      AuthenticationTypes.Secure);

どのアプローチを試しても(のように)、 Reflectorを使用するか、実行可能ファイルのProcess Explorerの文字列タブを使用してパスワード( m_pwdSecureString )を簡単に確認できます。

このコードをサーバーに配置したり、委任などのメカニズムを使用してセキュリティを強化したり、サービスアカウントに必要な権限のみを付与したりできることはわかっています。

誰かが、ハッカーにパスワードを明かさずに、ローカルアプリケーションにパスワードを保存するための合理的に安全な方法を提案できますか?

(照合目的のハッシュだけでなく)正確なパスワードを知る必要があるため、ハッシュはできません。暗号化/復号化メカニズムはマシンに依存しているため、機能していません。

4

4 に答える 4

25

正当化された方法は、CryptoAPI と Data Protection API を使用することです。

暗号化するには、次のようなものを使用します (C++):

DATA_BLOB blobIn, blobOut;
blobIn.pbData=(BYTE*)data;
blobIn.cbData=wcslen(data)*sizeof(WCHAR);

CryptProtectData(&blobIn, description, NULL, NULL, NULL, CRYPTPROTECT_LOCAL_MACHINE | CRYPTPROTECT_UI_FORBIDDEN, &blobOut);
_encrypted=blobOut.pbData;
_length=blobOut.cbData;

復号化は反対です。

DATA_BLOB blobIn, blobOut;
blobIn.pbData=const_cast<BYTE*>(data);
blobIn.cbData=length;

CryptUnprotectData(&blobIn, NULL, NULL, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN, &blobOut);

std::wstring _decrypted;
_decrypted.assign((LPCWSTR)blobOut.pbData,(LPCWSTR)blobOut.pbData+blobOut.cbData/sizeof(WCHAR));

CRYPTPROTECT_LOCAL_MACHINE を指定しない場合、暗号化されたパスワードはレジストリまたは構成ファイルに安全に保存され、あなただけが復号化できます。LOCAL_MACHINE を指定すると、そのマシンにアクセスできる人なら誰でも取得できます。

于 2008-09-02T22:58:13.183 に答える
12

前述のように、Data Protection API はこれを行うのに適した方法です。.NET 2.0 以降を使用している場合は、P/Invoke を使用して DPAPI を呼び出す必要がないことに注意してください。フレームワークは、呼び出しを System.Security.Cryptography.ProtectedData クラスでラップします。

于 2008-09-30T22:20:11.583 に答える
4

この本は、キース・ブラウンによるWindowsセキュリティの.NET開発者ガイドで見つけました。あらゆる種類のセキュリティシナリオをカバーするいくつかの優れたサンプルがあります。無料のオンラインバージョンもご利用いただけます。

于 2008-09-07T20:34:26.290 に答える
2

セキュリティで保護された文字列として保存し、セキュリティで保護された文字列をファイルに保存する場合 (おそらく分離ストレージを使用する場合、平文のパスワードを使用できるのは、暗号化を解除して mbstore を作成するときだけです。残念ながら、コンストラクターはSecureString または Credential オブジェクト。

于 2008-09-02T22:57:09.783 に答える