2015-10-01 5 views
7

मेरी डेटाबेस मैं एसक्यूएल है में,हैश एसक्यूएल और सी # में अलग है? मेरे पास है

DECLARE @InputString nvarchar(15) ='pass' 
DECLARE @InputSalt nvarchar(36) = 'FC94C37C-03A3-49A3-9B9F-D4A82E708618' 

DECLARE @HashThis nvarchar(100) 
Declare @BinaryHash varbinary(max) 
set @HashThis = @InputString + @InputSalt 
set @BinaryHash= HASHBYTES('SHA1', @HashThis) 
SELECT CAST(N'' AS XML).value('xs:base64Binary(xs:hexBinary(sql:variable("@BinaryHash")))', 'VARCHAR(MAX)') 

और सी #,

public static string HashString(string cleartext) 
{ 
    byte[] clearBytes = System.Text.Encoding.UTF8.GetBytes(cleartext); 
    return HashBytes(clearBytes); 
} 

public static string HashBytes(byte[] clearBytes) 
{ 
    var hasher = System.Security.Cryptography.SHA1.Create(); 
    byte[] hashBytes = hasher.ComputeHash(clearBytes); 
    string hash = System.Convert.ToBase64String(hashBytes); 
    hasher.Clear(); 
    return hash; 
} 
HashString("passFC94C37C-03A3-49A3-9B9F-D4A82E708618") 

लेकिन हैश अलग है?

C# Output: S55Nz1lyGweoJEHWcC6zFxJDKWQ= 
SQL Output: 4jqyC1pLJ0hW+AMNk8GOWCC99KY= 

https://dotnetfiddle.net/4bwAtm

+0

दोनों का उत्पादन क्या है? – CodeCaster

+0

@CodeCaster, ऊपर पोस्ट – user960567

+0

सी # मान (S55Nz1lyGweoJEHWcC6zFxJDKWQ =) इनपुट के लिए सही एक प्रतीत होता है, SQL कोड को ठीक करने की आवश्यकता है। –

उत्तर

6

आपका हैश फंक्शन, बाइट्स पर चलता पात्रों पर नहीं। आप वर्णों को बाइट्स में प्रभावी ढंग से अनुवाद करते हैं, लेकिन आप SQL में ऐसा करते हुए सी # में ऐसा नहीं करते हैं: आप SQL से nvarchar (UTF-16) का उपयोग करते हैं, तो आप सी # से यूटीएफ -8 का उपयोग करते हैं। आप या तो दूसरे से मिलान करने के लिए बदल सकते हैं।

चूंकि आपके पास अपने वर्तमान परीक्षण में कोई भी गैर-ASCII वर्ण नहीं है, इसलिए उस विशेष पासवर्ड के लिए, आप आसानी से सत्यापित कर सकते हैं कि यह आपके SQL में nvarchar से varchar को बदलकर समस्या है। यद्यपि युनिकोड वर्णों की पूरी श्रृंखला के लिए यह पर्याप्त नहीं होगा।

+0

ठीक है धन्यवाद मैं सी # कोड कैसे अपडेट कर सकता हूं। मैं एसक्यूएल अपडेट नहीं कर सकता क्योंकि हमारी मौजूदा प्रणाली इस पर आधारित है। – user960567

+0

मैंने यूटीएफ -8 को यूटीएफ -16 में बदल दिया है, 'System.Text.Encoding.Unicode.GetBytes (cleartext);' और यह काम कर रहा है। क्या यह एक सही फिक्स है? – user960567

+0

जब हमारे पास अरबी चार है तो यह काम नहीं कर रहा है। कृपया इसे ठीक करने में मेरी मदद करें। मैं केवल सी # – user960567

संबंधित मुद्दे