System.Security.SecureString クラスを使用して、処理中にクレジット カード番号をメモリに保持することを検討しています。クレジットカード番号を保持するためにSecureStringクラスを使用した人はいますか、それとも通常のSystem.Stringクラスを使用している人がほとんどですか?
4 に答える
PCI-DSS の観点からは、メモリにのみ保存されているカード番号を保護する必要はありません。
PCI は、カード番号がディスクに保持されるか、ネットワーク経由で送信される場合は暗号化する必要があるとのみ述べています。これは、この問題に対する常識的なアプローチです。SecureString を使用すると、文字列がディスクにキャッシュされることはありませんが、あなたが言うように、使用するのは面倒です。ただし、この投稿にはいくつかの良い提案があります: https://stackoverflow.com/questions/122784/hidden-net-base-class-library-classes#123141
理論的には、メモリを保護することで強度が増すように思えますが、実際には、悪者が RAM にアクセスできるようになると、いずれにせよほとんどゲーム オーバーになります。
2010 年の以前に受け入れられた回答は、当時は正しかったかもしれませんが、PCI DSS 3.0セクション 6.5 に注意してください。
一般的なコーディングの脆弱性を回避する方法や、機密データがメモリ内でどのように処理されるかを理解する方法など、安全なコーディング手法について開発者をトレーニングします。
最終的には、業界のベスト プラクティスを順守することが重要です。
機密データ (クレジット カード情報を含む) がマルウェアや攻撃者などによってメモリをスクレイピングされる近年の注目を集める侵害を考えると、メモリ内であっても機密情報を安全に保つことに重点が置かれています。
可能な場合は SecureString を使用してください。
それが不可能な場合は、自分が何に反対しているのかを理解してください。文字列は不変であり、ガベージ コレクションは常に信頼できるとは限らないため、取得したものを使用するだけで済みます。私が読んだ方法の 1 つは、文字列を BSTR にし、それをピン留めされた文字列にコピーしてから、使用後に BSTR とピン留めされた文字列の両方をゼロにすることです。少し「ハッキー」に感じますが、何もしないよりはマシです。
純粋に winform アプリ内でクレジット カード番号の取得を行う場合、カード番号をメモリに安全に保持することは非常に可能です。
ただし、ASP.NET Web アプリでは、よくわかりません...試したことはありませんが、 SO に関する一般的なコンセンサスは、それだけの価値がないようです。さらに、MSDNは特に次のように ASP.NET アプリについて言及しています。
SecureString クラスの使用は、ASP.NET アプリケーションではあまり適切ではありません。機密データ (クレジット カード番号など) を含む Web ページからデータを抽出し、中間システムを通過せずに SecureString 内に配置できる可能性はほとんどありません。文字列オブジェクト
おそらくプロジェクトは完了していますが、これが他の人の助けになることを願っています。
長時間メモリにキャッシュされる場合は、他のもの (クレジット カードではない) に SecureString を使用します。
私が遭遇し続ける問題は、実際に何かに使用するために通常の文字列にマーシャリングする必要があることです。そのため、その有用性は本当に限られています。
作業を少し楽にするために、いくつかの拡張メソッドを作成しました。
public static unsafe SecureString Secure(this string source)
{
if (source == null)
return null;
if (source.Length == 0)
return new SecureString();
fixed (char* pChars = source.ToCharArray())
{
SecureString secured = new SecureString(pChars, source.Length);
return secured;
}
}
public static string Unsecure(this SecureString source)
{
if (source == null)
return null;
IntPtr bstr = Marshal.SecureStringToBSTR(source);
try
{
return Marshal.PtrToStringUni(bstr);
}
finally
{
Marshal.ZeroFreeBSTR(bstr);
}
}
セキュアストリングを使用しないでください。PGはそれを非推奨にしています。ビデオを見ると、無数のセキュリティ問題の概要が説明されています。 https://github.com/dotnet/apireviews/tree/master/2015-07-14-securestring .