2010-07-06 19 views
12

İlginç bir sorunla karşılaştım .. HashAlgorithm.Create ("HMACSHA256") kullanarak HashAlgorithm'in iki örneğini oluşturursam, "HMACSHA256" karma değerinin ComputeHash() değeri deterministik olarak davranmıyor gibi görünüyor. ComputeHash, iki farklı sonuç elde ediyorum .. aşağıda bu davranışı sergileyen bir örnek statik sınıftır.ComputeHash neden deterministik olarak davranmıyor?

internal static string HashPassword(byte[] bAll) 
{ 
    using (HashAlgorithm s = HashAlgorithm.Create("HMACSHA256")) 
    { 
     return Convert.ToBase64String(s.ComputeHash(bAll)); 
    } 
} 

Ben de çağrı olmayan statik hale getirmeye çalıştık (aslında olmayan statik başladım ve çift ve üç ve quadrudruple .. Ben her çağrıda onun kesinlikle aynı benim giriş dizisi .. kontrol hatta immidiate pencere gibi bir şeyler yaptık:

Convert.ToBase64String(HashAlgorithm.Create("HMACSHA256").ComputeHash(bAll) 

Ve iki farklı karmaları döndüren yönteminde bir kesme noktası aracılığıyla iki kez immidiates pencerede o çalışan ..

Ben Hash deterministik olarak varsayalım biliyorum. Peki ne veriyor? Koşarak devam eden bir şey bir hata ayıklayıcıda? Ya da başka herhangi bir fikir? Gerçekten bu şu anda kelimeler için sadece iki garip :-P ..

Teşekkür Josh

+3

Bu sorunu gösteren herhangi bir kısa örnek verisi var mı? Aramalar arasında veya aralarında 'bAll' değişiyor mu? –

+4

HMAC anahtarlı bir hash.Örnek kodunda anahtarı göremiyorum. Birini açıkça belirtmezseniz anahtarın rastgele ayarlandığına inanıyorum. – dtb

+0

aramalar arasında hiçbir şey değişmez .. Gibi ben de bu imkansızlar penceresinden yaptım dedim .. İşte benim Immidiates penceresinden 4 çağrıları .. Evet mükemmel değil çünkü HashAlgorithm atmak gerekir, ama sonuçları aynı pencereleri veya yöntemi kullanarak aynı. (Onları bir sonraki yoruma dahil edeceğim, çünkü kopyalamak için alanım yok buraya yapıştırın) –

cevap

24

HMAC bir anahtarlı karma olduğunu. Örnek kodunda anahtarı göremiyorum.

HashAlgorithm.Create("HMACSHA256") bir HashAlgorithm örneği oluşturur, bu nedenle bir anahtar hakkında hiçbir şey bilmiyor. Muhtemelen sadece this HMACSHA256 Constructor çağırır:

public HMACSHA256()

bir rastgele oluşturulmuş anahtar ile HMACSHA256 sınıfının yeni bir örneğini başlatır.

Sen this constructor istiyorum:

public HMACSHA256(byte[] key)

belirtilen anahtar verileri ile HMACSHA256 sınıfının yeni bir örneğini başlatır. Eğer sabit bir şekilde kodlama için HMAC algoritması istemiyorsanız

, sen KeyedHashAlgorithm.Create kullanabilir ve KeyedHashAlgorithm.Key özelliğini ayarlayarak belirli bir anahtar sağlayabilmektedir.

Bir anahtar kullanmak istemiyorsanız, SHA256 gibi anahtarlanmamış bir karma kullanın.

+0

Onun en iyi bahsi ['KeyedHashAlgorithm.Create'] kullanmaktır (http://msdn.microsoft.com/en-us/library/s5zz2x4d.aspx). Alınan ders: karmalarınızı öğrenin! – Randolpho

+0

Sağlayıcı konuya girmeye çalışıyorum ve MS'in neden anahtarlanmış bir karmaya ayarlandığını/neden olduğunu, ancak genin HashAlgorithm.Create() öğesini kullanarak kullanacağını anlayacağım. Ben 4.0 framework ile 2.0 tabanlı ASP.NET Sağlayıcı başlangıç ​​paketi kaynağı kullanıyorum olabilir .. Neyse, bana doğru yönde işaret ettiğiniz için teşekkür ederiz. –

+0

@Josh: MS'nin “şaşırtıcı” bir rastlantıya sahip olduğu birkaç yer var. Örneğin, şifreleme için bazı "CypherMode" ayarları, belirtmezseniz rastgele bir Başlatma Vektörü kullanır. Şifreleme ve Şifre Çözme, verileriniz için ilk 8 bayttan fazlasına mükemmel bir şekilde çalıştığı zaman eğlenceli kısımdır. Bence burada iyi bir karar verdiler. Bir programın hızlı bir şekilde başarısız olmasını tercih ederim çünkü ihtiyaç duyduğu güvenlik parametrelerini "çalışan" fakat daha az güvenli bir duruma göre daha fazla anlayamıyorum. – Brian

3

HMACSHA256 için bir Anahtar gerekir. Anahtar, kurucuya aktarılmazsa rasgele olacaktır.

5

Sadece bunlardan birine girdiğim baş ağrısını kurtarmak umuduyla.

.Net Üyelik Sağlayıcısı durumunda, ayarın web.config veya app.config dosyasında bulunduğundan emin olun. Else otomatik olarak kendi anahtarını üretecek ... kimlik doğrulamasıyla uğraşacak, sonra da savaşan sonunda sana gülecek.

İlgili konular