Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

सदस्यता SHA1 हैश सभी उपयोगकर्ताओं के लिए समान नहीं है

हम्म .. मुझे लगता है कि कुछ गलत हो रहा हो सकता है जब दो मूल्यों को संयोजित किया जाता है। हैशिंग को वास्तव में एक बाइट सरणी का उपयोग करना चाहिए, एन्क्रिप्ट संस्करण की तरह , लेकिन दुर्भाग्य से CF9 का hash() फ़ंक्शन इसका समर्थन नहीं करता - केवल तार। (हालांकि खराब तरीके से प्रलेखित, यह CF11 में समर्थित है)। मुझे यकीन नहीं है कि सीएफ 9 के लिए शुद्ध सीएफ काम है या नहीं। हालांकि, इस बीच आप सीधे जावा का उपयोग कर सकते हैं:

<cfscript>
    thePassword = "[email protected]";
    base64Salt = "+muo6gAmjvvyy5doTdjyaA==";

    // extract bytes of the salt and password
    saltBytes = binaryDecode(base64Salt, "base64");
    passBytes = charsetDecode(thePassword, "UTF-16LE" );

    // next combine the bytes. note, the returned arrays are immutable, 
    // so we cannot use the standard CF tricks to merge them    
    ArrayUtils = createObject("java", "org.apache.commons.lang.ArrayUtils");
    dataBytes = ArrayUtils.addAll( saltBytes, passBytes );

    // hash binary using java
    MessageDigest = createObject("java", "java.security.MessageDigest").getInstance("SHA-1");
    MessageDigest.update(dataBytes);    
    theBase64Hash = binaryEncode(MessageDigest.digest(), "base64");

    WriteOutput("<br />theBase64Hash= "& theBase64Hash &"<br/>");
    WriteOutput("DBPassword= nfcqQBgeAm0Dp1oGZI0O70Y6DvA= <br />");
</cfscript>

अपडेट करें:

आगे देखने के बाद, मुझे नहीं लगता कि शुद्ध CF समाधान है। UTF-16LE एन्कोडिंग समस्या का ही एक हिस्सा है। दूसरा मुद्दा यह है कि डीएनएन प्रत्येक स्ट्रिंग को अलग से . डीकोड करता है , जो एक एकल . के रूप में दोनों को डिकोड किए जाने की तुलना में भिन्न बाइट उत्पन्न कर सकता है स्ट्रिंग (नीचे तुलना देखें)। यह आपके दूसरे पासवर्ड के मामले में करता है, यही वजह है कि अंतिम हैश अलग है। चूंकि hash बाइट सरणियों को स्वीकार नहीं करेगा, मुझे नहीं लगता कि यह इस काम के लिए सही उपकरण है। MessageDigest जाने का रास्ता है।

बाइट सरणी तुलना

           old|   new | 
   1 |     -6 |    -6 | 
   2 |    107 |   107 | 
   3 |    -88 |   -88 | 
   4 |    -22 |   -22 | 
   5 |      0 |     0 | 
   6 |     38 |    38 | 
   7 |   -114 |  -114 | 
   8 |     -5 |    -5 | 
   9 |    -14 |   -14 | 
  10 |    -53 |   -53 | 
  11 |   -105 |  -105 | 
  12 |    104 |   104 | 
  13 |     -3 |    77 | **
  14 |     -1 |   -40 | **
  15 |     68 |   -14 | **
  16 |      0 |   104 | **
  17 |     84 |    68 | **
  18 |      0 |     0 | 
  19 |     33 |    84 | **
  20 |      0 |     0 | 
  21 |     64 |    33 | **
  22 |      0 |     0 | 
  23 |     49 |    64 | **
  24 |      0 |     0 | 
  25 |     50 |    49 | **
  26 |      0 |     0 | 
  27 |        |    50 | **
  28 |        |     0 | **
  • पुराना => charsetDecode(theSalt &thePassword, "UTF-16LE")
  • नया => ArrayUtils.addAll (नमकबाइट्स, पासबाइट्स);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में, मैं किसी दी गई तालिका के लिए CREATE TABLE स्टेटमेंट कैसे जेनरेट करूं?

  2. SQL में अंकगणित अतिप्रवाह त्रुटि

  3. SQL Server 2008 में समग्र प्राथमिक कुंजी कैसे बनाएं?

  4. मैं SQL सर्वर में एक उच्चारण असंवेदनशील तुलना (ई, é, और के साथ) कैसे कर सकता हूं?

  5. पैरामीटर के साथ Database.ExecuteSqlCommand का उपयोग करने के लिए सही सिंटैक्स क्या है?