# Lisää matkaani ASP.NETin upeaan maailmaan 1.x ViewState

<datetime class="hidden">2004-02-29T00:00</datetime>

<!-- category -- mostlylucidcouk, Imported, ASP.NET, Security -->
Kirjoitin lehteen. [edellinen virka](/posts/694.aspx) että aioin poseerata [Näkymätila](http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemwebuicontrolclassviewstatetopic.asp), laajentaa asioita olen tehnyt pakkaus salaukseen ja allekirjoittaminen jne. , No on hyviä ja huonoja uutisia tälle suunnitelmalle. Näyttää siltä, että (todella) MAC- ja salaus juttuja käsitellään oikeasti LosWriter-luokassa; sisäinen luokka käyttää [LosFormatter](http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwebuilosformatterclasstopic.asp) Object serialization -ohjelman tekemiseen käytetään seuraavaa koodia (kiitos vielä kerran käyttökelvottomalle [Heijastin](http://www.aisto.com/roeder/dotnet/)) :

```
internal void CompleteTransforms(TextWriter output, bool enableMac, byte[] macKey)
{ int num1;
byte[] array1;
string text1;
char[] array2;
string text2;
num1 = 0;
if (this._recyclable)
{
 this._byteBuffer = ((byte[]) LosWriter._byteBufferAllocator.GetBuffer());
if (this._freePos > 0)
{
 num1 = Encoding.UTF8.GetBytes(this._charBuffer, 0, this._freePos, this._byteBuffer, 0);
 
}
if (enableMac)
{
 array1 = MachineKey.GetEncodedData(this._byteBuffer, macKey, 0, &(num1));
text1 = Convert.ToBase64String(array1, 0, num1);
output.Write(text1);
return; 
}
array2 = ((char[]) LosWriter._charBufferAllocatorBase64.GetBuffer());
num1 = Convert.ToBase64CharArray(this._byteBuffer, 0, num1, array2, 0);
output.Write(array2, 0, num1);
LosWriter._charBufferAllocatorBase64.ReuseBuffer(array2);
return; 
}
this._byteBuffer = Encoding.UTF8.GetBytes(this._charBuffer, 0, this._freePos);
num1 = this._byteBuffer.Length;
if (enableMac)
{
 this._byteBuffer = MachineKey.GetEncodedData(this._byteBuffer, macKey, 0, &(num1));
 
}
text2 = Convert.ToBase64String(this._byteBuffer);
output.Write(text2);
 
}
```

Kuten todennäköisesti näette, tämä koodi käsittelee MAC-avaimen käyttöä ja salausta sarjatietoihin. Tämä on koodi, jota MachineKey käyttää salauksen suorittamiseen:

```
internal static byte[] EncryptOrDecryptData(bool fEncrypt, byte[] buf, byte[] modifier, int start, int length)
{ MemoryStream stream1;
ICryptoTransform transform1;
CryptoStream stream2;
byte[] array1;
byte[] array2;
MachineKey.EnsureConfig();
stream1 = new MemoryStream();
transform1 = MachineKey.GetCryptoTransform(fEncrypt);
stream2 = new CryptoStream(stream1, transform1, 1);
stream2.Write(buf, start, length);
if (fEncrypt && (modifier != null))
{
 stream2.Write(modifier, 0, modifier.Length);
 
}
stream2.FlushFinalBlock();
array1 = stream1.ToArray();
stream2.Close();
MachineKey.ReturnCryptoTransform(fEncrypt, transform1);
if (!fEncrypt && (modifier != null))
{
 array2 = new byte[((uint) (array1.Length - modifier.Length))];
Buffer.BlockCopy(array1, 0, array2, 0, array2.Length);
array1 = array2;
 
}
return array1; 
} 
```

Valitettavasti tämä tarkoittaa, että minun on joko leikiteltävä Refelectorin lähteen pohtimisella / kaadottava Refelectorin lähde kokonaan uudelleen, miten tämä toimii mennäkseni paljon pidemmälle ViewState -keikkailullani, luoja, olisi ollut mukavaa, jos tämä olisi tehty tehtaan kanssa alun perin...epäilyt, että he eivät uskoneet kenenkään olevan niin hullu, että haluaisivat leikkiä sillä...:-)

Lopulta minun täytyy hellittää ja kirjoittaa artikkeli jonakin päivänä. Ongelma minulle on sen jäsentäminen niin, että se on luettavissa ihmisille, jotka eivät ole pakkomielteisiä.