私はデータの完全性について考えようとしていました。私はdbにシリアル化しようとしているオブジェクトを持っています。それがシリアル化されると、私はそれをハッシュして、DBに別の列としてデータと共に格納しようとしていました。シリアライゼーションとハッシュ
次に、私がデータベースからデータを取得すると、ハッシュをチェックして、ハッシュが一致すればデータをデシリアライズすることができました。
ここにポイントがありますか、それともCPUを浪費していますか?シリアライズされたオブジェクトを格納し、データがデータベース内で改ざんされていないことを検証する他の方法はありますか?データを格納するプログラムは、データを読み取るプログラムと同じでなくてもよい。
私の具体的な例は、EmailMessageオブジェクトを作成することです(System.Net.Mail.MailMessageはシリアル化できないため)、シリアル化してハッシュを作成します。両方ともデータベースに格納されます。後で私はシリアル化されたEmailMessageとハッシュを取ることができます。私はEmailMessageを取得し、別のハッシュを作成します。元のハッシュが新しいハッシュと同じであれば、MailMessageオブジェクトを生成して送信します。それ以外の場合は、TamperedWithException()を作成します。
以下のコードは、ハッシュを作成するために使用しているコードです。私はシリアル化を行うためにjson.netを使用しています。
public static class MD5HashHelper
{
public static string CreateHash(string str)
{
string hash;
using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create())
{
hash = BitConverter.ToString(
md5.ComputeHash(Encoding.UTF8.GetBytes(str))
).Replace("-", String.Empty);
}
return hash;
}
public static bool CompareWithHash(this string str, string hash)
{
string strHash = CreateHash(str);
return strHash.Equals(hash,StringComparison.Ordinal);
}
}
この特定のテーブルはまだ暗号化されていません。攻撃者は変更を加えて別のハッシュを作成する可能性があります。これはおそらくこれを行うより良い方法があると思う理由の一部です。以下は
はシリアライズです:
public static class JSONHelper
{
public static string ToJSON(this object obj)
{
string json = JsonConvert.SerializeObject(obj);
return json;
}
public static T JSONToObject<T>(this string json)
{
Object obj = JsonConvert.DeserializeObject<T>(json);
return (T)Convert.ChangeType(obj, typeof(T));
}
}
が私には合理的なようです:-) StackOverflowの中のランダムな男(私)よりも他の誰かからのセキュリティアドバイスを持っていると思います。 –
私はそれが合理的だと思うことに同意する...しかし、私は)1)あなたのハッシュアルゴリズム(つまり、なぜ攻撃者がデータを再ハッシュできないと仮定する)、2)あなたが暗号化しているかあなたのデータベース、3)あなたのアプリケーション環境内であなたのデータベースよりも高い価値を持つ場所が攻撃ベクトルの観点からないかどうか。 –
ハッシングとシリアライズのためのコードサンプルをいくつか追加しました。攻撃ベクトルに関しては、これは発信通信であり、着信アプリケーションデータには影響しません。 –