我有以下代碼與私有靜態成員。這些私有靜態成員是否線程安全?
所有這些類都表示它們在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);
}
}
對不起,我誤解了MSDN庫的術語。 – 2012-02-20 17:39:12