【问题标题】:ObjectDisposedException When using MD5 ComputeHash使用 MD5 ComputeHash 时的 ObjectDisposedException
【发布时间】:2012-08-26 02:17:29
【问题描述】:

我收到 ObjectDisposedException:安全句柄已关闭。

这是我的代码:

我正在尝试创建一个接口和实现类,使我能够获取一个字符串,将一个已知密钥附加到它,计算该字符串和密钥的 MD5 哈希,并返回计算出的哈希:

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();
    }
}

谢谢

【问题讨论】:

  • 哪行代码抛出异常?
  • hashed.ToHexString() 是扩展方法吗?我粘贴了您的代码,但该方法不存在...
  • 您好,这是一种扩展方法。抛出的行是: var hashed = _hashAlgo.ComputeHash(Encoding.UTF8.GetBytes(strWithKey));
  • 您的代码有效。问题应该在您向我们展示的内容之外的某个地方。很可能,_hashAlgo 某时被处置...
  • 这几乎肯定是一个多线程问题,这将导致这个异常。查看Finalizer issue under stress?的答案。

标签: c# hash cryptography md5 cryptographic-hash-function


【解决方案1】:

您的代码不是线程安全的。 _hashAlgo 不能在线程之间共享。请注意,您看到的异常并不是唯一可能导致的问题;我相信这个问题也可能导致不正确的哈希值。您需要每次都创建一个新的 HashAlgorithm 对象,或者查看线程局部变量以为每个线程创建一个实例。

【讨论】:

  • 这很可能是正确答案。请参阅Finalizer issue under stress? 的答案。并发访问同一个HashAlgorithm子类实例上的实例方法会导致这个异常。
  • that problem also can lead to incorrect hash values -- 这是真的。我前段时间遇到并解决了同样的问题。
【解决方案2】:

代码似乎可以正常工作。问题可能是:

  1. 对象是否在构造之间被序列化和反序列化 并使用?如果是这样,请将MDS.Create() 移动到内部GetSignature()
  2. 是否正在处理对象(SignService_hashAlgo)? 如果是这样,请不要丢弃它或在需要时重新创建它。

【讨论】:

    猜你喜欢
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-28
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    相关资源
    最近更新 更多