2011-09-07 8 views
5

मुझे स्ट्रिंग के SHA1 हैश मान के साथ कुछ समस्याएं हैं। मैं PHP में लिखे गए सर्वर पर VB.net में लिखे गए क्लाइंट से एक फ़ाइल भेजने की कोशिश कर रहा हूं। मेरी समस्या यह है कि जब मैं VB.net और PHP पर एक ही स्ट्रिंग पास करता हूं, तो VB.net द्वारा गणना की गई SHA1 मान PHP द्वारा गणना की गई मान से पूरी तरह अलग होती है।वही स्ट्रिंग, VB.net से प्राप्त विभिन्न SHA1 हैश मान और PHP

उदाहरण के लिए, मैं बेस 64 में एक स्ट्रिंग को एन्कोड करना चाहता हूं और फिर बेस 64 स्ट्रिंग के SHA1 हैश की गणना करना चाहता हूं। कंप्यूटर vb.net संस्करण से और PHP संस्करण से इस कार्य को निष्पादित करता है जब मैं दो अलग अलग SHA1 मान प्राप्त है, भले ही जाहिरा तौर पर Base64 इनकोडिंग स्ट्रिंग में एक ही है:

VB.net: 2E97A53B09C482A831540B532845BCAC79BFACCF पीएचपी: 350A2080264E2724D4BCBC521C35264D264A1DAF

मैं निश्चित रूप से कुछ याद कर रहा हूँ, तुम मुझे सही दिशा में बात और मुझे बताओ कि मैं गलत यहाँ क्या कर रहा हो सकता है?

आपको बहुत बहुत धन्यवाद

यहाँ VB.net कोड:

Dim cInput As String 
Dim cBase64 As String 
Dim objSHA1 As New SHA1CryptoServiceProvider() 
Dim abBytesToHash() As Byte 
Dim cHash As String 


cInput = "the quick brown fox jumps over the lazy dog" 
cBase64 = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(cInput)) 

abBytesToHash = System.Text.Encoding.ASCII.GetBytes(cBase64) 

abBytesToHash = objSHA1.ComputeHash(abBytesToHash) 
cHash = BitConverter.ToString(objSHA1.ComputeHash(abBytesToHash)) 
cHash = Replace(cHash, "-", "") 

MsgBox("BASE64: " + cBase64 + vbNewLine + "SHA1: " + cHash) 

' Result is: 
' BASE64: dGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw== 
' SHA1: 2E97A53B09C482A831540B532845BCAC79BFACCF 

और यहाँ पीएचपी कोड है:

$cInput = "the quick brown fox jumps over the lazy dog"; 
$cBase64 = base64_encode($cInput); 

echo("BASE64: " . $cBase64 . "<br />" . "SHA1: " . strtoupper(sha1($cBase64))); 

// Result is: 
// BASE64: dGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw== 
// SHA1: 350A2080264E2724D4BCBC521C35264D264A1DAF 
+2

इन तारों पर एन्कोडिंग क्या है? –

+0

मजेदार है कि http://www.tools4noobs.com/online_php_functions/sha1/ देता है 16312751ef9307c3fd1afbcb993cdc80464ba0f1 –

+0

@ कैप्टन: नहीं, ऐसा नहीं करता है, यह '350a2080264e2724d4bcbc521c35264d264a1daf' देता है। पाठ को धोया नहीं जा रहा है, इसका बेस 64 एन्कोडिंग है (क्यों, मुझे कोई जानकारी नहीं है)। – ircmaxell

उत्तर

6

ठीक है, समस्या यह है कि आप डबल हैशिंग रहे है .NET में और PHP में केवल एक ही हैशिंग। यहाँ तुम क्या नेट पीएचपी में अनुवाद में कर रहे हैं:

$cInput = "the quick brown fox jumps over the lazy dog"; 
$cBase64 = base64_encode($cInput); 

$sha = sha1($cBase64, true); // The true param returns the raw bytes instead of hex 
$chash = sha1($sha); 

तो आप डबल यह hashing कर रहे हैं। इसे ठीक करने के लिए, तुम सिर्फ करने के लिए अपने एल्गोरिथ्म को बदलने की जरूरत:

cInput = "the quick brown fox jumps over the lazy dog" 
cBase64 = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(cInput)) 

abBytesToHash = System.Text.Encoding.ASCII.GetBytes(cBase64) 

cHash = BitConverter.ToString(objSHA1.ComputeHash(abBytesToHash)) 
cHash = Replace(cHash, "-", "") 

ध्यान दें कि सभी मैंने किया था abBytesToHash = objSHA1.ComputeHash(abBytesToHash) लाइन हटाने ...

वैकल्पिक रूप से, आप PHP यह करने के लिए बदल सकता है:

$cInput = "the quick brown fox jumps over the lazy dog"; 
$cBase64 = base64_encode($cInput); 

echo "BASE64: " . $cBase64 . "<br />"; 
echo "SHA1: " . strtoupper(sha1(sha1($cBase64, true))); 
संबंधित मुद्दे