2012-08-31 15 views
5

Obtengo ObjectDisposedException: el identificador de seguridad se ha cerrado.ObjectDisposedException Al usar MD5 ComputeHash

Este es mi código:

Estoy tratando de crear una interfaz y la implementación de clase que me permitirá obtener una cadena, aplicables a la misma clave conocida, calcular hash MD5 para esta cadena y la llave, y devolver el hash calculado:

public interface ISignService 
{ 
    string GetSignature(string str); 
} 

public class SignService : ISignService 
{ 
    private readonly ISignSettings _signSettings; 
    private readonly HashAlgorithm _hashAlgo; 


    public SignService(ISignSettings signSettings) 
    { 
     _signSettings = signSettings; 
     _hashAlgo = MD5.Create(); 
    } 

    public string GetSignature(string str) 
    { 
     var strWithKey = str + _signSettings.EncryptionKey; 

     var hashed = _hashAlgo.ComputeHash(Encoding.UTF8.GetBytes(strWithKey)); 

     return hashed.ToHexString(); 
    } 
} 

Gracias

+2

¿Qué línea de código arroja la excepción? – ken2k

+0

¿'Hashed.ToHexString()' es un método de extensión? Pegué su código y el método no existe ... – Laoujin

+0

Hola, es un método de extensión. la línea que arroja es: var hashed = _hashAlgo.ComputeHash (Encoding.UTF8.GetBytes (strWithKey)); – user1625867

Respuesta

1

el código parece funcionar bien. El problema podría ser:

  1. ¿Se está serializando y deserializando el objeto entre la construcción y uso? En caso afirmativo, mueva el MDS.Create() al interior de GetSignature()
  2. ¿Se está desechando el objeto (SignService o _hashAlgo)? Si es así, no lo deseche ni lo vuelva a crear cuando sea necesario.
5

Su código no es seguro para subprocesos. _hashAlgo no se puede compartir entre subprocesos. Tenga en cuenta que la excepción que ve no es el único problema que puede ocasionar; Creo que ese problema también puede conducir a valores hash incorrectos. Debe crear un nuevo objeto HashAlgorithm cada vez o buscar locas de subprocesos para crear una instancia por subproceso.

+0

Probablemente esta sea la respuesta correcta. Consulte la respuesta a [¿Problema de Finalizer bajo tensión?] (Http://stackoverflow.com/a/26592826/1945631). El acceso simultáneo a métodos de instancia en la misma instancia de subclase 'HashAlgorithm' causará esta excepción. –

+1

'ese problema también puede conducir a valores hash incorrectos'; esto es cierto. Me enfrenté y resolví el mismo problema hace algún tiempo. – Denis