2012-08-31 20 views
5

Tôi nhận được ObjectDisposedException: Xử lý an toàn đã bị đóng.ObjectDisposedException Khi sử dụng MD5 ComputeHash

Đây là mã của tôi:

tôi đang cố gắng để tạo ra một giao diện và thực hiện các lớp đó sẽ cho phép tôi để có được một chuỗi, gắn vào nó một phím gọi, tính toán MD5 hash cho chuỗi này và chìa khóa, và trả lại băm tính:

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

Cảm ơn

+2

Dòng mã nào ném ngoại lệ? – ken2k

+0

Phương thức mở rộng là 'hashed.ToHexString()'? Tôi dán mã của bạn và phương pháp không tồn tại ... – Laoujin

+0

Xin chào, đó là một phương pháp mở rộng. dòng mà ném là: var hashed = _hashAlgo.ComputeHash (Encoding.UTF8.GetBytes (strWithKey)); – user1625867

Trả lời

1

mã này dường như làm việc tốt. Vấn đề có thể là:

  1. Đối tượng có được tuần tự hóa và deserialized giữa xây dựng và sử dụng? Nếu vậy, hãy di chuyển MDS.Create() sang bên trong GetSignature()
  2. Đối tượng có được xử lý (hoặc SignService hoặc _hashAlgo)? Nếu không, hãy vứt bỏ nó hoặc tái tạo nó khi cần thiết.
5

Mã của bạn không an toàn chỉ. Không thể chia sẻ _hashAlgo giữa các chuỗi. Lưu ý rằng ngoại lệ bạn thấy không phải là vấn đề duy nhất có thể xảy ra; Tôi tin rằng vấn đề cũng có thể dẫn đến giá trị băm không chính xác. Bạn cần phải tạo đối tượng HashAlgorithm mới mỗi lần hoặc xem xét các địa phương chuỗi để tạo một phiên bản cho mỗi chuỗi.

+0

Đây có thể là câu trả lời đúng. Xem câu trả lời cho [Vấn đề Finalizer dưới sự căng thẳng?] (Http://stackoverflow.com/a/26592826/1945631). Việc truy cập đồng thời vào các phương thức instance trên cùng một cá thể lớp con 'HashAlgorithm' sẽ gây ra ngoại lệ này. –

+1

'vấn đề đó cũng có thể dẫn đến giá trị băm không chính xác' - điều này đúng. Tôi phải đối mặt và giải quyết vấn đề tương tự một thời gian trước đây. – Denis

Các vấn đề liên quan