私の暗号化タイプに RSA を使用して QueryString 暗号化モジュールを実装しようとしているときに発生した奇妙なエラーについて、あなたが助けてくれることを願っています。私の質問は2倍です:
- 表示されるエラーの解決を手伝ってもらえますか?
- QueryString を暗号化するために RSA 以外のものをお勧めしますか?
背景/重要な情報:
セッションに保存する QueryString というオブジェクトを作成しました (そして、SessionID を使用してキー/ソルトを生成します)。キーを生成するSession Startでインスタンス化し、Session.Abandonで自然に終了します... BasePageで取得し、通常のクエリ文字列と同じようにページのあとがきで使用します(QueryString [key] for getsなど)...オブジェクトの内部プロパティとして、公開鍵と秘密鍵をオブジェクト自体に保存します。
もう 1 つの重要なことは、私の Web サイトには多くのグリッドがあり、その中にはリンクを含む行が記録されているため、設定する前にすべてを暗号化する必要があることです (href=...)... QueryString オブジェクト i作成されたものは、かなり迅速に課税される可能性があります(OnRowCreatedまたはhrefを暗号化する何かでループしている間)。
エラー:
現在、暗号化または復号化しようとすると、次のタイプの断続的なエラーが発生します。これは再現できません (ランダムに発生します... 信頼してください... 非常にランダムです):
エラータイプ 1 : CreateProvHandle エラー タイプ 2: 指定されたファイルが見つかりませんでした。エラー タイプ 3: 不正な操作を実行しようとしました。
エラー1と2については、これまでのところ、それを引き起こしたメソッド(暗号化または復号化)を再帰的に呼び出すだけで対処できましたが、通常は1回だけ再帰し(メトリックを使用して最大3回)、魔法のようにエラーが発生しましたが消える...だから私はそれをオブジェクト自体または何かへのあまりにも多くの呼び出しが速すぎると非難した.私のメソッドは、メジャーな例外が発生したときに真にスローされます。その上で、RSA パラメータに CSP ストアに何も永続化しないように指示したので、ファイルのことは問題ではないと思っていましたが、明らかにそうではありませんでした...
エラー 3 については、私はそれを理解することができません! 私の RSA パラメータは、CSP に何も永続化しないように指示しているため、ファイルにアクセスしようとする方法、時期、理由がわかりません (はい、繰り返します!)、制限されているファイルやユーザーがアクセスするファイルは言うまでもありませんにアクセスできませんか? 私を助けてください!!
これが私のRSAパラメーターのコードです...おそらく、私がやろうとしていることと一致しないものが見つかるでしょう(オブジェクトのインスタンス化でキーを一度生成し、オブジェクトをセッションに保存し、それをサイトまたは.NETの一部ではないサーバープロセスへのリモート/呼び出しをポイント/切断しますか?
public static void AssignParameter()
{
const int PROVIDER_RSA_FULL = 1;
const string CONTAINER_NAME = "ICareContainer";
CspParameters cspParams;
cspParams = new CspParameters(PROVIDER_RSA_FULL);
cspParams.KeyContainerName = CONTAINER_NAME;
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
cspParams.ProviderName = "Microsoft Strong Cryptographic Provider";
CryptoKeyAccessRule rule = new CryptoKeyAccessRule("everyone", CryptoKeyRights.FullControl, AccessControlType.Allow);
cspParams.CryptoKeySecurity = new CryptoKeySecurity();
cspParams.CryptoKeySecurity.SetAccessRule(rule);
rsa = new RSACryptoServiceProvider(cspParams);
rsa.PersistKeyInCsp = false;
rsa.KeySize = 1024;
}
public static string[] GetKeys()
{
AssignParameter();
string[] keys = new string[2];
//privatekey
keys[0] = rsa.ToXmlString(true);
//publickey
keys[1] = rsa.ToXmlString(false);
return keys;
}
public static string EncryptData(string data2Encrypt, string key)
{
AssignParameter();
string publicOnlyKeyXML = key;
rsa.FromXmlString(publicOnlyKeyXML);
//read plaintext, encrypt it to ciphertext
byte[] plainbytes = System.Text.Encoding.Default.GetBytes(data2Encrypt);
byte[] cipherbytes = rsa.Encrypt(plainbytes, false);
return Convert.ToBase64String(cipherbytes);
}
public static string DecryptData(string data2Decrypt, string key)
{
AssignParameter();
byte[] getpassword = Convert.FromBase64String(data2Decrypt);
string publicPrivateKeyXML = key;
rsa.FromXmlString(publicPrivateKeyXML);
//read ciphertext, decrypt it to plaintext
byte[] plain = rsa.Decrypt(getpassword, false);
return System.Text.Encoding.Default.GetString(plain);
}