1

3 つの異なる HTTP POST (ワークフローを考えてください) でのみ利用できるようにしたいデータがあり、この情報に QueryString や Cookie を使用したくありません。このため、ここでは _viewstate の概念が当てはまると思います。

  1. では、機密性と認証を含む 暗号化された非表示フィールドとして ASP.NET MVC で ViewState をエミュレートするにはどうすればよいでしょうか?

  2. ASP.NET 4 以降のフレームワークにはこれが含まれていますか?

詳しくは

ASP.NET は、暗号化された Viewstate をフォームの隠しフィールドとして使用していました。この利点の 1 つは、暗号化が「認証済み」であることです。つまり、暗号化されたペイロードで利用可能なプライバシー機能に加えて、改ざんが検出されます。

このサイトには、Viewstate を ASP.NET MVC に後付けする方法について議論する多くの質問がありますが、シリアル化されたデータに対するこれらの機能を含むデータの暗号化に対処する回答は見たことがありません。

  • 守秘義務(プライバシー)
  • 認証 (変更なし)
4

1 に答える 1

1

それは "Classic ASP" (1997 年から 2003 年にかけて普及した、COM を多用し、VBScript に適したプラットフォーム) ではなく、ViewState を使用する ASP.NET WebForms でした。ViewState 自体は、ページのコントロールのプロパティの Base64 でエンコードされた (暗号化されていない) 表現でした。これは、HTML フォームが追加のプロパティをサーバーに送信せず、<input>s'value=""属性のみを送信するために行われたため、ViewState にはコントロールの背景色プロパティ (設定されている場合) などのものが含まれていました。

WebForms では、開発者は ViewState 検証 MAC を使用してビューステート データが変更されていないことを確認できましたが、実際には頻繁に機能しなくなりました。「Validation of viewstate MAC failed」を検索すると、問題を回避する方法に関する無数の議論が見つかります。しかし、それは私の投稿では無関係な点です。

クライアント フォーム フィールドをラウンドトリップ データ ベクトルとして使用する場合は、それで問題ありません。以下のコードのように実行するだけです。

class PageViewModel {
    public String SecretData;
}

public ActionResult Foo() {

    Byte[] someSecretData = GetIcbmLaunchCodes();
    someSecretData = ArbitraryEncryptionAlgorithm( someSecretData ); // you can encrypt the data any way you want. I personally recommend a symmetric algorithm like AES or TripleDES.

    HashAlgorithm hashAlgo = new HMACSHA1();
    hashAlgo.Key = /* Your private key for HMAC */
    Byte[] hmac = hashAlgo.ComputeHash( someSecretData );

    // when using SHA1, hmac will be 160 bits long, or 20 bytes.
    PageViewModel model = new PageViewModel();
    model.SecretData = Convert.ToBase64String( hmac + someSecretData ); // array concatenation is an exercise for the reader
    return View( model );
}

[HttpPost]
public ActionResult Foo(PageViewModel model) {

    Byte[] postedData = Convert.FromBase64String( model.SecretData );

    Byte[] hmac = postedData[0...20]; // array substring is an exercise for the reader
    Byte[] secretData = postedData[20...n];

    // Now verify the secret data
    HashAlgorithm hashAlgo = new HMACSHA1();
    hashAlgo.Key = /* Your private key for HMAC */
    Byte[] hmac2 = hashAlgo.ComputeHash( secretData );

    if( hmac2 != hmac ) {
        /* the data has been tampered with. */
    } else {
        /* the data is unadulterated */

        Byte[] originalSecretData = ArbitaryDecryptionAlgorithm( secretData );
    }

}
于 2013-01-31T05:53:16.367 に答える