সি # তে হ্যাশ স্ট্রিং


92

হ্যাশ স্ট্রিংটি প্রবেশ করার চেষ্টা করার সময় আমার একটি সমস্যা আছে c#

আমি ইতিমধ্যে কয়েকটি ওয়েবসাইট চেষ্টা করেছি তবে তাদের বেশিরভাগ ফাইল হ্যাশ পেতে ফাইলগুলি ব্যবহার করছে। স্ট্রিংগুলির জন্য থাকা অন্যরা কিছুটা জটিল। আমি ওয়েবের জন্য উইন্ডোজ প্রমাণীকরণের জন্য উদাহরণগুলি পেয়েছি:

FormsAuthentication.HashPasswordForStoringInConfigFile(tbxPassword.Text.Trim(), "md5")

স্ট্রিং তৈরি করতে আমার একটি হ্যাশ ব্যবহার করা দরকার যা একটি ফাইল নাম ধারণ করে আরও সুরক্ষিত। আমি এটা কিভাবে করবো?

উদাহরণ:

string file  = "username";
string hash = ??????(username); 

আমার কি আরও একটি হ্যাশিং অ্যালগরিদম ব্যবহার করা উচিত এবং "এমডি 5" নয়?

উত্তর:


184
using System.Security.Cryptography;

public static byte[] GetHash(string inputString)
{
    using (HashAlgorithm algorithm = SHA256.Create())
        return algorithm.ComputeHash(Encoding.UTF8.GetBytes(inputString));
}

public static string GetHashString(string inputString)
{
    StringBuilder sb = new StringBuilder();
    foreach (byte b in GetHash(inputString))
        sb.Append(b.ToString("X2"));

    return sb.ToString();
}

অতিরিক্ত নোট

  • যেহেতু MD5 এবং SHA1 অপ্রচলিত এবং সুরক্ষিত অ্যালগরিদম, তাই এই দ্রবণটি SHA256 ব্যবহার করে। অন্যথা, আপনি ব্যবহার করতে পারেন BCrypt বা Scrypt মন্তব্য সরু আউট হিসাবে।
  • এছাড়াও, আপনার হ্যাশগুলিকে " সল্টিং " বিবেচনা করুন এবং মন্তব্যে নির্দেশিত হিসাবে প্রমাণিত ক্রিপ্টোগ্রাফিক অ্যালগরিদমগুলি ব্যবহার করুন।

46
MD5 বা SHA1 ব্যবহার করবেন না , তারা অপ্রচলিত এবং সুরক্ষিত অ্যালগরিদম। খুব স্বল্পতম বা আরও ভাল বিসিক্রিপ বা স্ক্রিপ্ট ব্যবহার করুন SHA256।
মুহাম্মদ রেহান সা Saeedদ

4
: SCrypt ব্যবহারের এই উদাহরণে দেখুন stackoverflow.com/questions/20042977/...
মুহাম্মদ রেহান সাঈদ

6
@ মুহ এটি চেকসামগুলির জন্য সহজেই ব্যবহার করা যেতে পারে কারণ এটি SHA512 এর চেয়ে অনেক দ্রুত। তবে প্রকৃতপক্ষে পাসওয়ার্ডগুলি সংরক্ষণ করার জন্য এটি প্রস্তাবিত নয়, যা সঠিক।
ভাগ্যবানলিকে

6
এর b.ToString("X2")অর্থ কী?
বিলাল ফজলানী

4
@BilalFazlani দেখতে stackoverflow.com/questions/20750062/...
Hezi

60

পাসওয়ার্ড স্টোরের উদ্দেশ্যে হ্যাশ স্ট্রিংয়ের দ্রুততম উপায়, নিম্নলিখিত কোড:

    internal static string GetStringSha256Hash(string text)
    {
        if (String.IsNullOrEmpty(text))
            return String.Empty;

        using (var sha = new System.Security.Cryptography.SHA256Managed())
        {
            byte[] textData = System.Text.Encoding.UTF8.GetBytes(text);
            byte[] hash = sha.ComputeHash(textData);
            return BitConverter.ToString(hash).Replace("-", String.Empty);
        }
    }

মন্তব্য:

  • যদি পদ্ধতিটি প্রায়শই আহ্বান করা হয়, তবে shaভেরিয়েবলের সৃষ্টিটি একটি শ্রেণীর ক্ষেত্রে পুনরুদ্ধার করা উচিত;
  • আউটপুট এনকোডড হেক্স স্ট্রিং হিসাবে উপস্থাপিত হয়;

SHA1Managedক্লাস খুব ব্যয়বহুল হয় না। এটি প্রায় 130 বাইট গ্রহণ করে এবং এটিকে কিছু স্থিতিশীল মান দিয়ে শুরু করে, তবে এটি সবই। সুতরাং বেশিরভাগ ক্ষেত্রে পারফরম্যান্সের সমস্যা হওয়া উচিত নয়।
আর্থ ইঞ্জিন

4
এছাড়াও SHA1Managedহয় IDisposableএবং এইভাবে একটি মধ্যে নিজের ব্যবহারের মোড়ানো প্রয়োজন usingব্লক।
আর্থ ইঞ্জিন

উদ্দেশ্য Disposeপদ্ধতিটি হ'ল অভ্যন্তরীণ বাফারটি সাফ করা। এটি করতে ব্যর্থ হওয়া স্মৃতিচারণের ঝুঁকিতে পড়বে।
আর্থ ইঞ্জিন

4
@ মুহম্মেদরহেনসেইদ যখন বলেছিলেন SHA1Managedযে ব্যয়বহুল নয়, আমি বোঝাতে চাইছি এটির সৃষ্টি নয়। এছাড়াও, একটি হ্যাশিং অ্যালগরিদম ব্যয়বহুল নয়। আপনি যখন কোনও সংঘর্ষের সন্ধান করতে চান এটি কেবলমাত্র (অত্যন্ত) ব্যয়বহুল হতে হবে।
আর্থ ইঞ্জিন

4
কিং_ফিশার - এটি অসম্ভব! হ্যাশ একটি উপায় ফাংশন, তথ্য হারিয়ে গেছে। আপনার যদি ডিক্রিপ্ট করার দরকার হয় তবে আপনাকে হ্যাশিং নয় এনক্রিপশন পদ্ধতিটি ব্যবহার করতে হবে। বিটিডাব্লু, পাসওয়ার্ড এনক্রিপ্ট করা একটি খারাপ অভ্যাস।
andrew.fox

8

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

শুধু getHashCode পদ্ধতি ব্যবহার করুন use

এটার মত:

string hash = username.GetHashCode();

4
হ্যাঁ, এটিই যা খুঁজছে। তবে কোডটি বড় ভুল। Int hash = "ব্যবহারকারীর নাম" এর মতো লেখা দেখান etGetHasCode ();
এডি চিউ

4
আপনি কেন ডাবল উক্তি ব্যবহারকারীর নাম রেখেছেন? এটি 'ব্যবহারকারীর নাম' শব্দের হ্যাশ পাবে এবং এখন ব্যবহারকারীর নামটি পরিবর্তনশীল।
সিরিল গুপ্ত

15
গেটহ্যাশকোড থেকে মানগুলি সঞ্চয় করবেন না, এটি 32x এবং 64x এর থেকে আলাদা
স্লাভা

13
এটি একটি পাসওয়ার্ড হ্যাশ তৈরির একটি খারাপ উপায়। গেটহ্যাশকোড () দিয়ে আপনি ধরে নিতে পারবেন না যে একই নম্বরটি বিভিন্ন কম্পিউটারে উত্পন্ন হবে। Sha1 হ্যাশ পদ্ধতি বা অন্য কিছু ব্যবহার করুন (আমি পরে একটি উদাহরণ পোস্ট করব)
andrew.fox

4
এটি লক্ষ করা উচিত যে GetHashCodeকোনও ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত হ্যাশিং অ্যালগরিদম নয়। সুরক্ষিত অ্যালগরিদমের জন্য খুব স্বল্পতম এমনকি বিসিক্রিপ্ট বা স্ক্রিপ্ট ব্যবহার করুন SHA256।
মুহাম্মদ রেহান সা Saeedদ

5

আমি মনে করি আপনি যা খুঁজছেন তা হ্যাশিং নয় বরং এনক্রিপশন। হ্যাশিংয়ের সাহায্যে আপনি "হ্যাশ" ভেরিয়েবল থেকে আসল ফাইলের নামটি পুনরুদ্ধার করতে পারবেন না। এনক্রিপশন সহ আপনি পারবেন এবং এটি সুরক্ষিত।

.NET এ এনক্রিপশন সম্পর্কে আরও তথ্যের জন্য VB.NET সহ ASP.NET এ AES দেখুন ।


হ্যাঁ, আমি মনে করি এনক্রিপশন, তবে আমি কেবল ফলাফলের হ্যাশ তুলনা করতে চাই। পুনর্নির্দেশ পৃষ্ঠা পরে।
এডি চিউ

আপনি হ্যাশ ফাইলের নামটির সাথে কী তুলনা করতে চান?
পিটার ভ্যান জিনকেল

1
//Secure & Encrypte Data
    public static string HashSHA1(string value)
    {
        var sha1 = SHA1.Create();
        var inputBytes = Encoding.ASCII.GetBytes(value);
        var hash = sha1.ComputeHash(inputBytes);
        var sb = new StringBuilder();
        for (var i = 0; i < hash.Length; i++)
        {
            sb.Append(hash[i].ToString("X2"));
        }
        return sb.ToString();
    }

4
এই লিঙ্কটি থেকে SHA1 ব্যবহার করবেন না , SHA1 একটি অপ্রচলিত এবং সুরক্ষিত অ্যালগরিদম। খুব স্বল্পতম বা আরও ভাল বিসিক্রিপ বা স্ক্রিপ্ট ব্যবহার করুন SHA256।
মুহাম্মদ রেহান সা Saeedদ

: SCrypt ব্যবহারের এই উদাহরণে দেখুন stackoverflow.com/questions/20042977/...
মুহাম্মদ রেহান সাঈদ

1

যদি পারফরম্যান্স কোনও বড় উদ্বেগ না হয় তবে আপনি এই যে কোনও পদ্ধতি ব্যবহার করতে পারেন:
(আপনি যদি চান যে হ্যাশ স্ট্রিংটি উপরের ক্ষেত্রে হয় তবে এর "x2"সাথে প্রতিস্থাপন করুন "X2"))

public static string SHA256ToString(string s) 
{
    using (var alg = SHA256.Create())
        return string.Join(null, alg.ComputeHash(Encoding.UTF8.GetBytes(s)).Select(x => x.ToString("x2")));
}

বা:

public static string SHA256ToString(string s)
{            
    using (var alg = SHA256.Create())
        return alg.ComputeHash(Encoding.UTF8.GetBytes(s)).Aggregate(new StringBuilder(), (sb, x) => sb.Append(x.ToString("x2"))).ToString();
}

0

সবচেয়ে স্বল্পতম এবং দ্রুততমতম উপায়। মাত্র 1 লাইন!

    public static string StringSha256Hash(string text) =>
        string.IsNullOrEmpty(text) ? string.Empty : BitConverter.ToString(new System.Security.Cryptography.SHA256Managed().ComputeHash(System.Text.Encoding.UTF8.GetBytes(text))).Replace("-", string.Empty);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.