Одна техника, предложенная эта статья , состояла бы в том, чтобы сделать это:
В итоге я создал новое имя KeyContainer на основе текущего DateTime (DateTime.Now.Ticks.ToString ()) всякий раз, когда мне нужно создать новый ключ и сохранить контейнер. имя и открытый ключ к базе данных. Кроме того, всякий раз, когда я создаю новый ключ, я делаю следующее:
public static string ConvertToNewKey(string oldPrivateKey)
{
// get the current container name from the database...
rsa.PersistKeyInCsp = false;
rsa.Clear();
rsa = null;
string privateKey = AssignNewKey(true); // create the new public key and container name and write them to the database...
// re-encrypt existing data to use the new keys and write to database...
return privateKey;
}
public static string AssignNewKey(bool ReturnPrivateKey){
string containerName = DateTime.Now.Ticks.ToString();
// create the new key...
// saves container name and public key to database...
// and returns Private Key XML.
}
перед созданием нового ключа.
Конструктор RSACryptoServiceProvider (CspParameters)
создает пару ключей, которая хранится в хранилище ключей на локальном компьютере. Если у вас уже есть пара ключей с указанным именем, будет использоваться существующая пара ключей.
Похоже, вы не заинтересованы в хранении ключа на машине.
Поэтому используйте 1149275] RSACryptoServiceProvider (Int32) конструктор:
public static void AssignNewKey(){
RSA rsa = new RSACryptoServiceProvider(2048); // Generate a new 2048 bit RSA key
string publicPrivateKeyXML = rsa.ToXmlString(true);
string publicOnlyKeyXML = rsa.ToXmlString(false);
// do stuff with keys...
}
РЕДАКТИРОВАТЬ:
В качестве альтернативы попробуйте установить для PersistKeyInCsp значение false:
public static void AssignNewKey(){
const int PROVIDER_RSA_FULL = 1;
const string CONTAINER_NAME = "KeyContainer";
CspParameters cspParams;
cspParams = new CspParameters(PROVIDER_RSA_FULL);
cspParams.KeyContainerName = CONTAINER_NAME;
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
cspParams.ProviderName = "Microsoft Strong Cryptographic Provider";
rsa = new RSACryptoServiceProvider(cspParams);
rsa.PersistKeyInCsp = false;
string publicPrivateKeyXML = rsa.ToXmlString(true);
string publicOnlyKeyXML = rsa.ToXmlString(false);
// do stuff with keys...
}