mysql - ডাটাবেসে ব্যবহারকারীর নাম এবং পাসওয়ার্ড সংরক্ষণ করা কি নিরাপদ?



.net vb.net (2)

না, আপনার ডাটাবেসে পরিষ্কার পাঠ্য পাসওয়ার্ড সংরক্ষণ করা উচিত নয়।

কারণটি হ'ল যদি আপনার ডাটাবেস হ্যাক / চুরি / আপোস হয় তবে আপনার ব্যবহারকারীর সমস্ত পাসওয়ার্ড হ্যাকারের কাছে উপলব্ধ।

পরিবর্তে আপনার যা করা উচিত তা হ'ল: - যখন কোনও ব্যবহারকারী সাইন আপ করে, পাসওয়ার্ডের একটি হ্যাশ সংস্করণ সহ ডাটাবেসে তার ব্যবহারকারীর নামটি সংরক্ষণ করে - যখন কোনও ব্যবহারকারী লগইন করতে চেষ্টা করে, ডাটাবেস থেকে ব্যবহারকারীর নামটি পেয়ে যায়, পাসওয়ার্ডটি হ্যাশ করে ডাটাবেসে হ্যাশ পাসওয়ার্ডের সাথে এটি সরবরাহ এবং তুলনা করুন।

হ্যাশিং একটি স্ট্রিংকে অন্য স্ট্রিংয়ে রূপান্তর করার একটি উপায়, যেখানে আপনি কেবল একপথে যেতে পারেন (অর্থাত্, একই ইনপুটটি সর্বদা একই আউটপুট উত্পন্ন করবে, তবে আপনি যদি কেবলমাত্র আউটপুট থাকে তবে আপনি কখনই ইনপুট ফিরে পেতে পারবেন না)।

কীভাবে একটি স্ট্রিং হ্যাশ করবেন তা জানার জন্য, দয়া করে নীচের নিবন্ধটি পড়ুন, এতে বিভিন্ন ভাষার কোড কোড রয়েছে: https://crackstation.net/hashing-security.htm

আমার কাছে লোকেরা তখন একটি বংশের জন্য একটি ব্যবহারকারীর নাম এবং পাসওয়ার্ড জমা দিয়েছে এবং এটি জানতে একটি ডেটাবেজে জমা দেওয়ার জন্য এই কোডটি ব্যবহার করা নিরাপদ কিনা বা এটি কোনও ডেটাবেসে নিরাপদ কিনা তাও আমার জানা দরকার।

MySQLCon.Open()
Dim SQLADD As String = "INSERT INTO members(username,password) VALUES(@memberToAdd, @memberPassword)"
COMMAND = New MySqlCommand(SQLADD, MySQLCon)
COMMAND.Parameters.AddWithValue("@memberToAdd", memberToAdd.Text)
COMMAND.Parameters.AddWithValue("@memberPassword", membersPassword.Text)
COMMAND.ExecuteNonQuery()
MySQLCon.Close()
MySQLCon.Dispose()

এসকিউএল ইঞ্জেকশন আক্রমণগুলি এড়াতে আমি প্যারামিটার ব্যবহার করি।

-------------------------------------------------- --------------------------------

এটি কোনও সদৃশ ছিল না কারণ এটি পাসওয়ার্ডটি জিজ্ঞাসা ও সঞ্চয় করার বিভিন্ন উপায়ে ছিল। এটি পাসওয়ার্ড হ্যাশ করার জন্য MD5 ব্যবহার করছিল।


সুরক্ষার মৌলিক পরিমাপের সাথে পাসওয়ার্ডগুলি সংরক্ষণ করার প্রক্রিয়া মোটামুটি সহজ:

  • লবণের সাথে পাসওয়ার্ডগুলি হ্যাশ করুন
  • প্রতিটি ব্যবহারকারীর / পাসওয়ার্ডের জন্য আলাদা লবণ ব্যবহার করুন
  • ডিবিতে হ্যাশ পাসওয়ার্ডের সাহায্যে লবণ সংরক্ষণ করুন
  • যখন তারা লগ ইন করার চেষ্টা করে, একই পদ্ধতিতে পিডাব্লুয়ের চেষ্টাটি চালান; ফলাফল তুলনা করুন।

যদি তারা সঠিক পাসওয়ার্ডটি প্রবেশ করায় তবে হ্যাশড পিডাব্লুও মিলবে। হ্যাশিং ব্যবহারকারীদের আক্রমণ থেকে রক্ষা করার পাশাপাশি members টেবিলের সাথে স্ক্রিনে হাঁটতে থাকা দারোয়ানকে রক্ষা করে।

সল্ট তৈরি এবং পিডাব্লু হ্যাশিং

' salt size is 32 (0-31
Private Const SaltSize As Integer = 31
...

Dim dbPW As String = TextBox1.Text
Dim dbSalt = CreateNewSalt(SaltSize)
' eg: "dsEGWpJpwfAOvdRZyUo9rA=="

Dim SaltedPWHash As String = GetSaltedHash(dbPW, dbSalt)
' examples:
' using SHA256: bbKN8wYYgoZmNaG3IsQ2DPS2ZPIOnenl6i5NwUmrGmo=
' using SHA512: 
' 0vqZWBIbOlyzL25l9iWk51CxxJTiEM6QUZEH1ph+/aNp+lk4Yf8NYv8RLhYtbqCNpOqO3y8BmM+0YWtbAhE+RA=="

ব্যবহারকারীর রেকর্ডের অংশ হিসাবে পিডাব্লু হ্যাশ এবং লবণ সংরক্ষণ করুন। লবণটি গোপন নয়, তবে / ব্যবহারকারী যদি তাদের পাসওয়ার্ড পরিবর্তন করে তবে এটি পরিবর্তন করুন।

একটি লগইন প্রচেষ্টা তুলনা

' check if PW entered equals DB
Dim pwTry = TextBox2.Text
' hash the login attempt using the salt stored in the DB
Dim pwLogin = GetSaltedHash(pwTry, dbSalt)

' compare the hash of what they entered to whats in the DB:
If String.Compare(SaltedPWHash, pwLogin, False) = 0 Then
    ' okay!
    Console.Beep()
End If

যদি ব্যবহারকারী একই পিডব্লিউতে প্রবেশ করে, তবে একই হ্যাশের ফলস্বরূপ এটি হওয়া উচিত as হ্যাশিং কোডটি এত জটিল নয়:

হ্যাশ পদ্ধতি

Private Function GetSaltedHash(pw As String, salt As String) As String
    Dim tmp As String = pw & salt

    ' or SHA512Managed
    Using hash As HashAlgorithm = New SHA256Managed()
        ' convert pw+salt to bytes:
        Dim saltyPW = Encoding.UTF8.GetBytes(tmp)
        ' hash the pw+salt bytes:
        Dim hBytes = hash.ComputeHash(saltyPW)
        ' return a B64 string so it can be saved as text 
        Return Convert.ToBase64String(hBytes)
    End Using

End Function

Private Function CreateNewSalt(size As Integer) As String
    ' use the crypto random number generator to create
    ' a new random salt 
    Using rng As New RNGCryptoServiceProvider
        ' dont allow very small salt
        Dim data(If(size < 7, 7, size)) As Byte
        ' fill the array
        rng.GetBytes(data)
        ' convert to B64 for saving as text
        Return Convert.ToBase64String(data)
    End Using
End Function
  • System.Guid.NewGuid.ToString ( System.Guid.NewGuid.ToString ) এর মতো লবণের মতো কিছু ব্যবহার করা লোভনীয় তবে ক্রিপ্টোগ্রাফিক র্যান্ডম সংখ্যা জেনারেটরটি ব্যবহার করা System.Guid.NewGuid.ToString কঠিন নয়।
  • হ্যাশ পাসওয়ার্ডের মতো, এনকোডিংয়ের কারণে রিটার্নের স্ট্রিং দীর্ঘতর।
  • প্রতিবার ব্যবহারকারী তাদের পাসওয়ার্ড পরিবর্তন করে একটি নতুন লবণ তৈরি করুন। বিশ্বব্যাপী লবণ ব্যবহার করবেন না, এটি উদ্দেশ্যকে পরাস্ত করে।
  • আপনি একাধিকবার পিডব্লিউ হ্যাশ করতে পারেন। কীটির অংশটি হ'ল / যখন আক্রমণ করা হয় তখন সমস্ত বিভিন্ন সংমিশ্রনের চেষ্টা করতে এটি দীর্ঘ সময় নেয়।
  • ফাংশনগুলি Shared / static শ্রেণীর সদস্যদের জন্য আদর্শ প্রার্থী।

আরও লক্ষ করুন, Kenneth সাথে যুক্ত নিবন্ধটি ভালভাবে পড়ার পক্ষে worth

নোটটি উল্লেখ করেছে উল্লেখ করুন নোটটি The salt should be stored in the user account table alongside the hash অর্থ এই নয় যে আপনার অবশ্যই ডিবিতে Salt কলাম থাকতে হবে। লিঙ্কযুক্ত নিবন্ধে আপনি নিম্নলিখিতটি সম্পন্ন দেখতে পারেন:

Dim dbPW As String = TextBox1.Text
Dim dbSalt = CreateNewSalt(SaltSize)

' get the salted PW hash
Dim SaltedPWHash As String = GetSaltedHash(dbPW, dbSalt)
' store salt with the hash:
SaltedPWHash = String.Format("{0}:{1}", dbSalt, dbPW)
' salt + ":" + hashed PW now ready to store in the db

হ্যাশ পাসওয়ার্ড থেকে লবণ বিভক্ত করতে:

Dim SaltAndPWHash = rdr.Item("PWHash").ToString()

Dim split = SaltAndPWHash.Split(":"c)    ' split on ":"
Dim Salt = split(0)                      ' element(0) == salt
Dim StoredPWHash = split(1)              ' element(1) == hashed PW

আপনার উভয় অংশের প্রয়োজন: পিডব্লিউ-তে লগ করার চেষ্টা করার পরে, এটি split(1) করার জন্য তুলনা করুন split(1)





vb.net