2014-09-17 2 views
6

मैं क्रिप्टोग्राफी के लिए बिल्कुल नया हूं, लेकिन सीख रहा हूं। मैंने अपने शोध से ऑनलाइन कई अलग-अलग सुझाव प्राप्त किए हैं, और हैश, नमक, कुंजी खींचने, और संबंधित डेटा की तुलना/रूपांतरण को संभालने के लिए अपनी कक्षा बनाई है।मैं अपने नमक और हैश कोड में RFC2898DeriveBytes के साथ SHA-512 का उपयोग कैसे करूं?

क्रिप्टोग्राफी के लिए अंतर्निहित .NET लाइब्रेरी का शोध करने के बाद, मैंने पाया कि मेरे पास अभी भी केवल SHA-1 है। लेकिन मैं इस निष्कर्ष पर आ रहा हूं कि यह बुरा नहीं है क्योंकि मैं हैश प्रक्रिया के एकाधिक पुनरावृत्तियों का उपयोग कर रहा हूं। क्या वो सही है?

लेकिन अगर मैं अधिक मजबूत SHA-512 से शुरू करना चाहता था, तो मैं इसे नीचे दिए गए कोड में कैसे कार्यान्वित कर सकता हूं? अग्रिम में धन्यवाद।

using System; 
using System.Runtime.InteropServices; 
using System.Security; 
using System.Security.Cryptography; 

public class CryptoSaltAndHash 
{ 
    private string strHash; 
    private string strSalt; 
    public const int SaltSizeInBytes = 128; 
    public const int HashSizeInBytes = 1024; 
    public const int Iterations = 3000; 

    public string Hash { get { return strHash; } } 
    public string Salt { get { return strSalt; } } 

    public CryptoSaltAndHash(SecureString ThisPassword) 
    { 
     byte[] bytesSalt = new byte[SaltSizeInBytes]; 
     using (RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider()) 
     { 
      crypto.GetBytes(bytesSalt); 
     } 
     strSalt = Convert.ToBase64String(bytesSalt); 
     strHash = ComputeHash(strSalt, ThisPassword); 
    } 

    public static string ComputeHash(string ThisSalt, SecureString ThisPassword) 
    { 
     byte[] bytesSalt = Convert.FromBase64String(ThisSalt); 
     Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(
      convertSecureStringToString(ThisPassword), bytesSalt, Iterations); 
     using (pbkdf2) 
     { 
      return Convert.ToBase64String(pbkdf2.GetBytes(HashSizeInBytes)); 
     } 
    } 

    public static bool Verify(string ThisSalt, string ThisHash, SecureString ThisPassword) 
    { 
     if (slowEquals(getBytes(ThisHash), getBytes(ComputeHash(ThisSalt, ThisPassword)))) 
     { 
      return true; 
     } 
     return false; 
    } 

    private static string convertSecureStringToString(SecureString MySecureString) 
    { 
     IntPtr ptr = IntPtr.Zero; 
     try 
     { 
      ptr = Marshal.SecureStringToGlobalAllocUnicode(MySecureString); 
      return Marshal.PtrToStringUni(ptr); 
     } 
     finally 
     { 
      Marshal.ZeroFreeGlobalAllocUnicode(ptr); 
     } 
    } 

    private static bool slowEquals(byte[] A, byte[] B) 
    { 
     int intDiff = A.Length^B.Length; 
     for (int i = 0; i < A.Length && i < B.Length; i++) 
     { 
      intDiff |= A[i]^B[i]; 
     } 
     return intDiff == 0; 
    } 

    private static byte[] getBytes(string MyString) 
    { 
     byte[] b = new byte[MyString.Length * sizeof(char)]; 
     System.Buffer.BlockCopy(MyString.ToCharArray(), 0, b, 0, b.Length); 
     return b; 
    } 
} 

नोट्स: मैं https://crackstation.net/hashing-security.htm से प्रथाओं का एक बहुत संदर्भित किया है। धीमी गति तुलना तुलना विधि शाखाकरण को रोकने से निष्पादन समय को सामान्य करना है। SecureString का उपयोग इस वेब और मेरे वेब एप्लिकेशन के भीतर अन्य वर्गों और पृष्ठों के बीच पासवर्ड पास का एन्क्रिप्टेड रूप होना है। हालांकि यह साइट HTTPS से अधिक हो जाएगी, फिर भी यह सुनिश्चित करने के लिए अतिरिक्त मील जाना हमेशा अच्छा होता है कि चीजें यथासंभव सुरक्षित हैं जबकि अभी भी कारण के भीतर हैं।

मेरे कोड में, मैंने कुंजी स्ट्रिंग को 128 बाइट्स पर सेट किया है (हालांकि यह कभी-कभी बढ़ता है, जो ठीक है), हैश आकार 1 केबी, और 3,000 पर पुनरावृत्तियों की संख्या। यह सामान्य 64 बाइट नमक, 512 बाइट हैश, और 1,000 या 2,000 पुनरावृत्तियों की तुलना में थोड़ा बड़ा है, लेकिन फिर फिर से लॉगिन गति और ऐप प्रदर्शन बेहद कम प्राथमिकता है।

विचार?

+0

कोड समीक्षा पर समान प्रश्न: [सुरक्षित पासवर्ड हैशिंग] (http://codereview.stackexchange.com/questions/32856/secure-password-hashing) – CodesInChaos

उत्तर

5

प्रश्न का उत्तर दें: "SecurityDriven.NET" पुस्तक से मुफ्त कोड नमूने डाउनलोड करें। पीबीकेडीएफ 2 कक्षा खोजें जो एचएमएसी फैक्ट्री लेता है। एचएमएसीएसएएच 512 फैक्ट्री दूसरों के बीच उपलब्ध है।

जब से तुम क्रिप्टोग्राफी के लिए नए हैं, मैं भी दृढ़ता से आप पढ़ सकते हैं पुस्तक का सुझाव (उदा। पूरी तरह से अंक कि CodesInChaos बनाया समझने के लिए)।

+0

धन्यवाद। जबकि वे उदाहरण .NET 4.5 का उपयोग करते हैं, मैं .NET 4.0 पर हूं। हालांकि उन्हें न्यूनतम परिवर्तनों के साथ दोनों के लिए काम करना चाहिए। वे उदाहरण मुझे आवश्यक एन्क्रिप्शन क्लास का संदर्भ देते हैं: http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha512%28v=vs.100%29.aspx –

8
  1. 3000 पुनरावृत्तियों काफी कम है। यहां तक ​​कि 10000 कम है। लेकिन आपको जोखिम के खिलाफ अतिरिक्त पुनरावृत्तियों के सुरक्षा लाभ को कम करने की आवश्यकता है कि एक हमलावर अक्सर लॉगिन करने का प्रयास करके आपके सर्वर को करता है, जो प्रत्येक प्रयास के लिए एक महंगा हैश ट्रिगर करता है।
  2. 128 बिट्स/16 बाइट्स से बड़े नमक में कोई बिंदु नहीं है। एक नमक अद्वितीय होना चाहिए, और कुछ नहीं।
  3. देशी आकार (SHA-1 के लिए 20 बाइट) से अधिक हैश आकार डिफेंडर के लिए प्रदर्शन को कम करता है लेकिन हमलावर के लिए नहीं। चूंकि इसका मतलब है कि आप कम पुनरावृत्तियों का जोखिम उठा सकते हैं, यह वास्तव में सुरक्षा को कमजोर करता है।

    उदाहरण के लिए 3000 पुनरावृत्तियों के साथ आपके 1024 बाइट हैश के समान लागत पर, आप 156000 पुनरावृत्तियों के साथ 20 बाइट हैश का भुगतान कर सकते हैं, जो क्रैक करने के लिए 52 गुना अधिक महंगा है।

  4. SHA-2 का उपयोग करने के लिए आपको एक पूरी तरह से अलग PBKDF2 कार्यान्वयन की आवश्यकता होगी, जिसे .NET के साथ शामिल किया गया है SHA-1 का उपयोग करने के लिए हार्डकोड किया गया है।

    यदि आप किसी तृतीय पक्ष लाइब्रेरी का उपयोग करने के लिए परेशान हैं, तो मैं जीपीयू आधारित हमलावरों के खिलाफ बहुत मजबूत होने के बाद से एक bcrypt लाइब्रेरी का उपयोग करूंगा।

  5. आपका एपीआई उपयोग करने के लिए अजीब है, क्योंकि आप Create/Verify फ़ंक्शंस में इसे संभालने के बजाय कॉलर पर नमक प्रबंधन को दबाते हैं।

  6. SecureString का उपयोग करने के लिए मूर्खतापूर्ण है और फिर इसे String में परिवर्तित करने के लिए मूर्खतापूर्ण है। यह पहली जगह SecureString का उपयोग करने के पूरे बिंदु का विरोध करता है।

    व्यक्तिगत रूप से मैं एक विशिष्ट अनुप्रयोग में SecureString से परेशान नहीं होगा।यह केवल सार्थक है यदि आप इसे एक व्यापक पूर्ण-स्टैक सुरक्षा समीक्षा के साथ जोड़ते हैं जो जांचता है कि पासवर्ड कभी भी String में संग्रहीत नहीं होता है और इसे अब आवश्यक होने के बाद हमेशा परिवर्तनीय संग्रहण से मिटा दिया जाता है।

  7. मैं उदाहरण चर में पासवर्ड/लवण की दुकान नहीं होगा। बस उन्हें प्रासंगिक कार्यों में स्थानीय रखें। मैं केवल इंस्टेंस चर (जैसे पुनरावृत्ति गणना) में कॉन्फ़िगरेशन संग्रहीत करता हूं।

  8. SHA-1 क्रिप्टोग्राफी द्वारा कमजोर हो जाता है, हमलों टकराव पैदा करते हैं। पासवर्ड हैशिंग टकराव के लिए अप्रासंगिक हैं, जो आप परवाह करते हैं वह पहले प्री-इमेज हमले होते हैं। एसएचए -1 अभी भी उस संबंध में काफी मजबूत है।

    एसएचए -512 का मुख्य लाभ यह नहीं है कि यह क्रिप्टोग्राफिक रूप से मजबूत है (हालांकि यह है), यह 64 बिट अंकगणित हमलावर को डिफेंडर से अधिक खर्च करता है, क्योंकि डिफेंडर शायद 64 बिट इंटेल CPU का उपयोग करेगा जो तेजी से प्रदान करता है 64 बिट अंकगणितीय।

+0

उत्कृष्ट सलाह, बहुत बहुत धन्यवाद! मुझे केवल सिक्योरस्ट्रिंग का उपयोग करना याद होगा अगर मैं इसे कोड में स्ट्रिंग में कभी नहीं बदलता। जैसा कि मेरे एपीआई का उपयोग करने के लिए अजीब है, ऐसा लगता है कि यह ठीक काम करता है। नमक बनाने के लिए कक्षा को तत्काल बनाएं और पहले से बनाए गए हैश को सत्यापित करने के लिए इसे स्थिर रूप से कॉल करें। कॉलर पर कोई प्रबंधन धक्का नहीं दिया। हालांकि मेरा प्रश्न आपके # 4 बिंदु के चारों ओर घूमता है। क्या आप उस सुझाव पर अधिक विस्तृत करने में सक्षम होंगे और इसे .NET पर्यावरण में कैसे कार्यान्वित किया जाएगा (उदाहरण: एक SHA-2 लाइब्रेरी चुनें जिसे आप अनुशंसा करेंगे)। एक बार फिर धन्यवाद! –

+0

मैंने पीबीकेडीएफ 2-एचएमएसी-एसएचए -2 के सी # कार्यान्वयन में कभी भी परेशान नहीं किया, इसलिए मुझे वास्तव में पता नहीं है। मुझे लगता है कि बाउंसीकैसल इसका समर्थन करता है। व्यक्तिगत रूप से मैं bcrypt.net और अन्य bcrypt कार्यान्वयन का मूल्यांकन करना चाहता हूं। – CodesInChaos

1

यदि कोई व्यक्ति इस खोज को खोज के साथ सामना करता है, तो अब माइक्रोसॉफ्ट Microsoft.AspNetCore.Cryptography.KeyDerivation NuGet पैकेज प्रदान करता है, जो पीएचकेडीएफ 2 को एसएचए -256 और एसएचए -512 हैश फ़ंक्शन के साथ उपयोग करने की अनुमति देता है। दस्तावेज़ीकरण docs.microsoft.com पर उपलब्ध है।

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