それは "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 );
}
}