2009-08-25 18 views
3

次のように私はC#クラスを持っている:C#でオブジェクトをシリアル化して改ざんを防止する方法は?

public class TestObj 
{ 
    private int intval; 
    private string stringval; 
    private int[] intarray; 
    private string[] stringarray; 

    //... public properties not shown here 
} 

私は文字列に、このクラスのインスタンスをシリアル化したいと思います。また

私はURLへのQueryStringのparamとしてこの文字列を追加します。だから私は、文字列が簡単に改ざんされないようにするために何らかの努力をしたいと思います。

また、私は直列化方法が効率的であり、文字列のサイズがminmalであることを望みます。

具体的な.NET Frameworkクラス/メソッドの提案を使用する必要がありますか?

public String SerializeObject(TestObj object) 
{ 
     String Serialized = String.Empty; 
     MemoryStream memoryStream = new MemoryStream (); 
     XmlSerializer xs = new XmlSerializer(typeof(TestObj)); 
     XmlTextWriter xmlTextWriter = new XmlTextWriter (memoryStream, Encoding.UTF8); 
     xs.Serialize (xmlTextWriter, object); 
     memoryStream = (MemoryStream) xmlTextWriter.BaseStream; 
     Serialized = UTF8Encoding.GetString(memoryStream.ToArray()); 
     return Serialized; 
} 

2)改ざんを防ぐために:シリアライズする

答えて

4

1)

  • は、例えば、秘密の文字列を思い付きます"MySecretWord"。
  • シリアライズされたオブジェクトインスタンスを文字列として取り、シークレットワードを追加します。
  • ハッシュ文字列(例えばSHA やレムスによって示唆されているように(HMACを使用)
  • もあなたの「MySecretWord」秘密を知っている(受信側では、クエリ文字列

にハッシュを追加文字列)を使用してハッシュを取り除き、元のシリアライズされたインスタンスを取得し、既知のシークレット文字列を追加してハッシュします。次に、2つのハッシュを比較して、等しいかどうかを確認します。それらが等しい場合、あなたの文字列は変更されませんでした。

Url/Base64文字列をエンコードしてクエリ文字列として使用する必要がある場合があります。これは、送信されたものと正確に一致するようにクエリ文字列を必要とする場合にも重要です。

+0

この問題は、宛先とのシークレットの共有や更新に対処できないという問題があります。おそらく、改ざんを防止したい場合は、反対側が無効な値をチェックする方法を知っている必要があります。また、予測可能な秘密を使用すると、誰かがオブジェクトを改ざんしてハッシュを再計算する可能性があります。 – Omniwombat

+0

ホイールを改造しないでください。 CLRは適切な暗号化技術者によって見直されたHMAC署名をボックスから提供します。 –

+1

@Omniwombat:これは、情報のクエリ文字列の送信を扱っているため、確かに高いセキュリティのシナリオではありません。秘密の純粋な存在は、どんな「攻撃者」も捨てるでしょう。また、秘密は無期限に複雑になるように選択することができます。これにより、ハッシング・ソリューションはセキュリティのニーズに合わせて拡張できますが、その場合、ラインに沿って文字列全体を暗号化します。いずれにしても、改ざん防止のために、彼は目的地にアクセスする必要があります。 – Alex

4

ストリームに署名し、クエリに署名を追加します。 HMACSHA1のようなHMAC署名アルゴリズムを使用します。署名に署名して検証するには、クライアントとサーバーの間に秘密が必要です。

関連する問題