現在のアプリケーションの ASP.NET マシン キーを取得したいと思っています。もちろん、これは構成ファイルでマシン キーが指定されている場合は簡単ですが、自動生成に設定されている場合は、それを取得するパブリック メソッドがどこにもないように見えます。
基本的には、ASP.NET フォーム認証プロバイダーと同じように、自分用に暗号化/MAC 化された Cookie を作成できるようにしたいと考えています。
誰にも指針やアイデアはありますか?
現在のアプリケーションの ASP.NET マシン キーを取得したいと思っています。もちろん、これは構成ファイルでマシン キーが指定されている場合は簡単ですが、自動生成に設定されている場合は、それを取得するパブリック メソッドがどこにもないように見えます。
基本的には、ASP.NET フォーム認証プロバイダーと同じように、自分用に暗号化/MAC 化された Cookie を作成できるようにしたいと考えています。
誰にも指針やアイデアはありますか?
.NET 4を使用している場合は、MachineKeyクラスがあります。実際のキーへの生のアクセスは提供されませんが、FormsAuthenticationクラスと同じアルゴリズムを使用してデータをエンコードおよびデコードするためのメソッドと、HMACを使用して検証を追加するためのオプションが提供されます。
.Net 4.5の場合、コードは次のとおりです
//using System.Reflection
//using System.Web.Configuration
byte[] autogenKeys = (byte[])typeof(HttpRuntime).GetField("s_autogenKeys", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null);
Type t = typeof(System.Web.Security.DefaultAuthenticationEventArgs).Assembly.GetType("System.Web.Security.Cryptography.MachineKeyMasterKeyProvider");
ConstructorInfo ctor = t.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic)[0];
Type ckey = typeof(System.Web.Security.DefaultAuthenticationEventArgs).Assembly.GetType("System.Web.Security.Cryptography.CryptographicKey");
ConstructorInfo ckeyCtor = ckey.GetConstructors(BindingFlags.Instance | BindingFlags.Public)[0];
Object ckeyobj = ckeyCtor.Invoke(new object[] { autogenKeys });
object o = ctor.Invoke(new object[] { new MachineKeySection(), null, null, ckeyobj, null });
var encKey = t.GetMethod("GetEncryptionKey").Invoke(o, null);
byte[] encBytes = ckey.GetMethod("GetKeyMaterial").Invoke(encKey, null) as byte[];
var vldKey = t.GetMethod("GetValidationKey").Invoke(o, null);
byte[] vldBytes = ckey.GetMethod("GetKeyMaterial").Invoke(vldKey, null) as byte[];
string decryptionKey = BitConverter.ToString(encBytes);
decryptionKey = decryptionKey.Replace("-", "");
string validationKey = BitConverter.ToString(vldBytes);
validationKey = validationKey.Replace("-", "");
ありがとう、おさるさん。
あなたのポインタに基づいて、私はこれを得ました:
private byte[] _validationKey;
private byte[] _decryptionKey;
public static byte[] GetKey(object provider, string name)
{
var validationKey = provider.GetType().GetMethod(name).Invoke(provider, new object[0]);
return (byte[])validationKey.GetType().GetMethod("GetKeyMaterial").Invoke(validationKey, new object[0]);
}
protected override void OnLoad(EventArgs e)
{
var machineKey = typeof(MachineKeySection).GetMethods(BindingFlags.Static | BindingFlags.NonPublic).Single(a => a.Name == "GetApplicationConfig").Invoke(null, new object[0]);
var type = Assembly.Load("System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a").GetTypes().Single(a => a.Name == "MachineKeyMasterKeyProvider");
var instance = type.Assembly.CreateInstance(
type.FullName, false,
BindingFlags.Instance | BindingFlags.NonPublic,
null, new object[] { machineKey, null, null, null, null }, null, null);
var validationKey = type.GetMethod("GetValidationKey").Invoke(instance, new object[0]);
var key = (byte[])validationKey.GetType().GetMethod("GetKeyMaterial").Invoke(validationKey, new object[0]);
_validationKey = GetKey(instance, "GetValidationKey");
_decryptionKey = GetKey(instance, "GetEncryptionKey");
}
ASP.NET フォーム認証プロバイダーがアクセスできる場合、プロバイダーのソース コードを調べてみましたか? (これは正しい場所だと思います。この件に関するScottGu の元のブログ投稿は、MSDN が更新されてからリンクが壊れています)
本当に鍵が必要ですか?それとも、データを暗号化および復号化するだけですか?
System.Web.Security.FormsAuthentication (.NET 2.0) には、パブリックな Encrypt/Decrypt メソッドがあります。これらは、System.Web.Configuration.MachineKeySection EncryptOrDecryptData、ByteArrayToHexString、および HexStringToByteArray を使用してデータを暗号化および復号化します。
EncryptOrDecryptData は、必要に応じて構成ファイル/AutoGenerate からのキー データの読み込み/構成を処理します。
Encrypt And Decrypt は、ソース コードのダウンロードまたはリフレクターを介して利用でき、目的に合わせてすぐに変換できる必要があります。