我看到我維護的一些代碼存在問題。下面的代碼有一個private static SHA1
成員(這是一個IDisposable
,但因爲它是static
,它永遠不會被最終確定)。然而,在壓力下這段代碼拋出表明它已經關閉了異常:爲什麼SHA1.ComputeHash在高負載下有很多線程會失敗?
Caught exception. Safe handle has been closed"
Stack trace: Call stack where exception was thrown
at System.Runtime.InteropServices.SafeHandle.DangerousAddRef(Boolean& success)
at System.Security.Cryptography.Utils.HashData(SafeHashHandle hHash, Byte[] data, Int32 cbData, Int32 ibStart, Int32 cbSize)
at System.Security.Cryptography.Utils.HashData(SafeHashHandle hHash, Byte[] data, Int32 ibStart, Int32 cbSize)
at System.Security.Cryptography.HashAlgorithm.ComputeHash(Byte[] buffer)
的代碼中的問題是:
internal class TokenCache
{
private static SHA1 _sha1 = SHA1.Create();
private string ComputeHash(string password)
{
byte[] passwordBytes = UTF8Encoding.UTF8.GetBytes(password);
return UTF8Encoding.UTF8.GetString(_sha1.ComputeHash(passwordBytes));
}
我的問題是明顯,是什麼引發了這個問題。對SHA1.Create
的調用是否可以無提示失敗(有多少加密資源可用)?這可能是由應用程序域名下降造成的嗎?
其他理論?
這是什麼都與處置呢?另外,哪個「SHA1」類是那個? – 2014-10-27 16:51:27
你確定類SHA1是線程安全嗎?當它失敗時你能夠獲取被哈希處理的密碼嗎? – Rob 2014-10-27 16:51:56
@約翰桑德斯,對不起,你是對的。這與Dispose無關。我認爲System.Security.Cryptography.SHA1CryptoServiceProvider上的終結器可能以某種方式被觸發。 http://msdn.microsoft.com/en-us/library/e7hyyd4e(v=vs.110).aspx – MvdD 2014-10-27 16:53:50