मैं क्रिप्टोग्राफी के लिए बिल्कुल नया हूं, लेकिन सीख रहा हूं। मैंने अपने शोध से ऑनलाइन कई अलग-अलग सुझाव प्राप्त किए हैं, और हैश, नमक, कुंजी खींचने, और संबंधित डेटा की तुलना/रूपांतरण को संभालने के लिए अपनी कक्षा बनाई है।मैं अपने नमक और हैश कोड में 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 पुनरावृत्तियों की तुलना में थोड़ा बड़ा है, लेकिन फिर फिर से लॉगिन गति और ऐप प्रदर्शन बेहद कम प्राथमिकता है।
विचार?
कोड समीक्षा पर समान प्रश्न: [सुरक्षित पासवर्ड हैशिंग] (http://codereview.stackexchange.com/questions/32856/secure-password-hashing) – CodesInChaos