У меня есть следующий код с закрытыми статическими членами.
Все эти классы говорят, что они потокобезопасны в библиотеке MSDN для членов "public static ".
Мой вопрос заключается в том, будут ли эти члены потокобезопасными при использовании в качестве приватной статики вместо «публичной статики», как указано в библиотеке 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);
}
}