Ich sehe ein Problem mit einem von mir gepflegten Code. Der folgende Code hat ein private static SHA1
Mitglied (das ist ein IDisposable
, aber da es static
ist, sollte es nie finalisiert werden). Doch dieser Code unter Stress löst eine Ausnahme aus, dass es geschlossen wurde schon sagt:Warum scheitert SHA1.ComputeHash unter hoher Last mit vielen Threads?
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)
Der Code in Frage:
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));
}
Meine Frage ist offensichtlich, was dieses Problem verursachen könnte. Kann der Aufruf an SHA1.Create
im Hintergrund fehlschlagen (wie viele kryptografische Ressourcen sind verfügbar)? Könnte das durch das Herunterfahren der Appdomain verursacht werden?
Irgendwelche anderen Theorien?
Was hat das mit Entsorgen Sie zu tun? Auch welche "SHA1" -Klasse ist das? –
Sind Sie sicher, dass die Klasse SHA1 threadsafe ist? Können Sie das Passwort abrufen, wenn es fehlschlägt? – Rob
@John Saunders, Entschuldigung, Sie haben Recht. Dies hat nichts mit Dispose zu tun. Ich dachte, dass der Finalizer auf dem System.Security.Cryptography.SHA1CryptoServiceProvider irgendwie ausgelöst worden sein könnte. http://msdn.microsoft.com/en-us/library/e7hyyd4e(v=vs.110).aspx – MvdD