У меня есть следующий код с частными статическими членами.
Все эти классы говорят, что они потокобезопасны в библиотеке MSDN для «общедоступных статических» элементов.
Мой вопрос заключается в том, будут ли эти члены потокобезопасными при использовании в качестве частной статики вместо «общедоступной статики», как указано в библиотеке MSDN.
public static class passwordManager
{
private static System.Security.Cryptography.SHA256 shaM = new System.Security.Cryptography.SHA256Managed();
private static System.Security.Cryptography.RandomNumberGenerator rand = new System.Security.Cryptography.RNGCryptoServiceProvider();
private static System.Text.Encoding enc = System.Text.Encoding.ASCII;
public static string produceSalt(int size)
{
byte[] by = new byte[size];
lock (rand)
{
rand.GetBytes(by);
}
return enc.GetString(by, 0, by.Length);
}
public static string encryptPassword(string password, string salt){
return enc.GetString(shaM.ComputeHash(enc.GetBytes(password + salt)));
}
public static bool isCorrectPassword(string inputPassword, string DBsalt, string DBpassword)
{
return encryptPassword(inputPassword, DBsalt) == DBpassword;
}
Это может полностью зависеть от того, используют ли сами методы, которые я использую, общие переменные вместо всех переменных экземпляра метода... некоторое спокойствие было бы полезно, но я бы предпочел не блокировать все здесь, если это не необходимо.
Единственная причина, по которой я заблокировал генератор случайных чисел, заключается в том, чтобы ограничить возможность получения одной и той же соли, однако вероятность того, что это будет вызвано двумя потоками одновременно, в моей ситуации очень мала.
Спасибо,
Майк
Теперь это должно быть потокобезопасным. Я пытался сэкономить на накладных расходах на создание объекта, но я думаю, что есть компромисс между этим и ожиданием блокировки. При высокой нагрузке ожидание блокировки системы, вероятно, значительно превысит накладные расходы на создание экземпляров и использование памяти.
public static class passwordManager
{
private static System.Security.Cryptography.RandomNumberGenerator rand = new System.Security.Cryptography.RNGCryptoServiceProvider();
public static byte[] produceSalt(int size)
{
byte[] by = new byte[size];
lock (rand)
{
rand.GetBytes(by);
}
return by;
}
public static byte[] encryptPassword(string password, byte[] salt){
System.Security.Cryptography.SHA256 shaM = new System.Security.Cryptography.SHA256Managed();
System.Text.Encoding enc = new System.Text.UTF8Encoding();
return shaM.ComputeHash(concatArrays(enc.GetBytes(password), salt));
}
public static bool isCorrectPassword(string inputPassword, byte[] DBsalt, byte[] DBpassword)
{
return compare(encryptPassword(inputPassword, DBsalt), DBpassword);
}
}