আরএস 256 বনাম এইচএস 256: পার্থক্য কী?


254

আমি আমার ওয়েব অ্যাপ্লিকেশনটিতে প্রমাণীকরণ হ্যান্ডেল করতে Auth0 ব্যবহার করছি। আমি এএসপি.নেট কোর v1.0.0 এবং কৌণিক 2 আরসি 5 ব্যবহার করছি এবং আমি সাধারণভাবে প্রমাণীকরণ / সুরক্ষা সম্পর্কে খুব বেশি জানি না।

ASP.NET কোর ওয়েব অপির জন্য Auth0 ডক্সে , JWT অ্যালগরিদমের আরএস 256 এবং এইচএস 256 থাকার জন্য দুটি পছন্দ রয়েছে। এটি বোবা প্রশ্ন হতে পারে তবে:

আরএস 256 এবং এইচএস 256 এর মধ্যে পার্থক্য কী? কিছু ব্যবহারের ক্ষেত্রে কী আছে (যদি প্রযোজ্য হয়)?


সার্ভার-সাইড অ্যাপ্লিকেশন টিউটোরিয়াল freakyjolly.com/…
কোড স্পাই

উত্তর:


437

উভয় পছন্দই পরিচয় প্রদানকারী JWT- এ সাইন ইন করতে আলগোরিদিম ব্যবহার করে to সইনিং হ'ল একটি ক্রিপ্টোগ্রাফিক অপারেশন যা "স্বাক্ষর" (জেডাব্লুটিটির অংশ) উত্পন্ন করে যা টোকেনটি প্রাপক তা নিশ্চিত করতে নিশ্চিত করতে পারে যে টোকেনটি যাতে ছত্রভঙ্গ হয় নি।

  • আরএস 256 (এসএএ-256 সহ আরএসএ স্বাক্ষর ) একটি অসম্পূর্ণ অ্যালগরিদম এবং এটি একটি সর্বজনীন / বেসরকারী কী জুটি ব্যবহার করে: পরিচয় প্রদানকারীটির স্বাক্ষর তৈরি করতে ব্যবহৃত একটি ব্যক্তিগত (গোপন) কী থাকে এবং জেডাব্লুটিটির গ্রাহক একটি পাবলিক কী পান স্বাক্ষর বৈধ করতে। যেহেতু পাবলিক কীটি প্রাইভেট কী-এর বিপরীতে সুরক্ষিত রাখার দরকার নেই, তাই বেশিরভাগ পরিচয় প্রদানকারী তাদের গ্রাহকরা সহজেই এটি ব্যবহার এবং ব্যবহারের জন্য সহজলভ্য করে তোলে (সাধারণত একটি মেটাডাটা URL এর মাধ্যমে) through

  • অন্যদিকে এইচএস 256 (এসএইচএ -২6 with সহ এইচএমএসি ), একটি হ্যাশিং ফাংশন এবং একটি (গোপন) কী এর সংমিশ্রণ যা হ্যাশ উত্পন্ন করতে ব্যবহৃত দুটি দলের মধ্যে ভাগ করা হয় যা স্বাক্ষর হিসাবে কাজ করবে। যেহেতু একই কীটি স্বাক্ষর উত্পন্ন করতে এবং এটি যাচাইকরণের জন্য উভয়ই ব্যবহৃত হয়, তাই কীটি আপস না করে তা নিশ্চিত করার জন্য অবশ্যই যত্নবান হতে হবে।

আপনি যদি জেডব্লিউটি ব্যবহার করে অ্যাপ্লিকেশনটি বিকাশ করছেন তবে আপনি নিরাপদে এইচএস 256 ব্যবহার করতে পারবেন কারণ গোপন কীগুলি ব্যবহার করে আপনার নিয়ন্ত্রণ থাকবে। অন্যদিকে, যদি ক্লায়েন্টের উপর আপনার নিয়ন্ত্রণ না থাকে বা আপনার কোনও গোপন কী সুরক্ষিত করার কোনও উপায় না থাকে তবে আরএস 256 আরও ভাল উপযুক্ত হবে, যেহেতু ভোক্তাকে কেবল সর্বজনীন (ভাগ করা) কীটি জানতে হবে।

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

অউথ0 ওআইডিসি, এসএএমএল এবং ডাব্লুএস-ফেড প্রোটোকলের জন্য মেটাডেটা সমাপ্তি সরবরাহ করে, যেখানে পাবলিক কীগুলি পুনরুদ্ধার করা যায়। আপনি ক্লায়েন্টের "অ্যাডভান্সড সেটিংস" এর অধীনে সেই শেষগুলি দেখতে পারেন।

ওআইডিসি মেটাডেটা শেষ পয়েন্ট, উদাহরণস্বরূপ, এর রূপ নেয় https://{account domain}/.well-known/openid-configuration। আপনি যদি সেই ইউআরএল ব্রাউজ করেন তবে আপনি কোনও JSON অবজেক্টের উল্লেখ সহ দেখতে পাবেন https://{account domain}/.well-known/jwks.json, এতে অ্যাকাউন্টের সর্বজনীন কী (বা কী) রয়েছে।

আপনি যদি আরএস 256 নমুনাগুলি দেখেন, আপনি দেখতে পাবেন আপনার কোথাও সর্বজনীন কীটি কনফিগার করার দরকার নেই: এটি ফ্রেমওয়ার্কের মাধ্যমে স্বয়ংক্রিয়ভাবে পুনরুদ্ধার করা হয়েছে।


45
আরবি 256 ব্যবহার করার সময় এনবি - অনেক লাইব্রেরিতে সুরক্ষার ঝুঁকি রয়েছে (বা ছিল) যা টোকেনকে কোন অ্যালগরিদমটি ব্যবহার করবে তা নির্ধারণ করার অনুমতি দিয়েছিল। মূলত আক্রমণকারীটি hs256 এনকোডিং দিয়ে জনসাধারণের rs256 কী ব্যবহার করতে পারত এটি গোপন কী। সুতরাং আপনার লাইব্রেরিতে এই আচরণ না হয় তা নিশ্চিত করুন!
অ্যালেক্সফক্সগিল 9

7
একটি ছোট সংশোধন, "HS256 (SHA-256 সহ HMAC), অন্যদিকে, একটি প্রতিসম অ্যালগরিদম" - এইচএমএসি একটি প্রতিসম-কী অ্যালগরিদম ব্যবহার করে না (যা আপনাকে এর সংজ্ঞা দিয়ে স্বাক্ষরটিকে এনক্রিপ্ট এবং ডিক্রিপ্ট করার অনুমতি দেয়)। এটি এইচএমএসি এর নীচে একটি ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশন এবং একটি গোপন ক্রিপ্টোগ্রাফিক কী ব্যবহার করে । যা সংযুক্ত গোপন কী সহ বার্তাগুলির উপর হ্যাশ (একমুখী ফাংশন) এর গণনা বোঝায়।
কিকোজ

1
গুগলের সাথে উদাহরণ: অ্যাকাউন্ট .google.google.com/.well-علوم/openid-configration এ যান এবং jwks_uri দেখুন; এটি আপনাকে googleapis.com/oauth2/v3/certs এ এগিয়ে দেয় যেখানে আপনি কীগুলি খুঁজে পেতে পারেন can তারপরে আপনাকে তার বাচ্চা দ্বারা ভাল কীটি পুনরুদ্ধার করতে হবে।
ডেনিস ট্রাফট

লক্ষণীয় যে এইচএস 256 দুটি দলের মধ্যে একটি কী ভাগ করে যা এই অ্যালগরিদমটিকে এক অ্যাক্সেস-টোকনে একাধিক শ্রোতাদের সমর্থন করতে অক্ষম করে, যেখানে আরএস 256 অনেক শ্রোতাদের সমর্থন করতে পারে। এটি Auth0 এর মতো পরিচয় ক্লায়েন্টদের সাথে সম্পর্কিত যারা কনফিগারেশনটি RS256 হলে কেবল একটি প্রবেশ_ টোকেন ব্যবহার করে / ইউজারইনফো প্রান্তিক বিন্দুতে একটি অনুরোধের অনুমতি দেয়, কারণ তাদের এডি হিসাবে আপনার এপিআই ডোমেনকে সমর্থন করার জন্য এই টোকেনটি প্রয়োজন, পাশাপাশি তাদের অ্যাথ0 ​​ডোমেন।
jezpez

94

ক্রিপ্টোগ্রাফিতে দুটি ধরণের অ্যালগোরিদম ব্যবহৃত হয়:

প্রতিসম অ্যালগরিদম

ডেটা এনক্রিপ্ট করার জন্য একটি সিঙ্গল কী ব্যবহার করা হয়। কীটি এনক্রিপ্ট করা হলে, একই কী ব্যবহার করে ডেটা ডিক্রিপ্ট করা যায়। উদাহরণস্বরূপ, যদি মেরি "মাই-সিক্রেট" কীটি ব্যবহার করে একটি বার্তা এনক্রিপ্ট করে এবং এটি জনকে প্রেরণ করে তবে তিনি একই কী "মাই-সিক্রেট" দিয়ে বার্তাটি সঠিকভাবে ডিক্রিপ্ট করতে সক্ষম হবেন।

অসমমিতিক অ্যালগরিদম

দুটি কী কী বার্তা এনক্রিপ্ট এবং ডিক্রিপ্ট করতে ব্যবহৃত হয়। একটি কী (সর্বজনীন) বার্তাটি এনক্রিপ্ট করার জন্য ব্যবহৃত হয়, অন্য কী (ব্যক্তিগত) কেবল এটি ডিক্রিপ্ট করার জন্য ব্যবহার করা যেতে পারে। সুতরাং, জন সরকারী এবং ব্যক্তিগত উভয় কী তৈরি করতে পারে, তারপরে মেরীর কাছে কেবল তার বার্তা এনক্রিপ্ট করার জন্য সর্বজনীন কী প্রেরণ করবে। বার্তাটি শুধুমাত্র ব্যক্তিগত কী ব্যবহার করে ডিক্রিপ্ট করা যায়।

এইচএস 256 এবং আরএস 256 দৃশ্য

এই অ্যালগরিদমগুলি ডেটা এনক্রিপ্ট / ডিক্রিট করতে ব্যবহৃত হয় না। বরং এগুলি ডেটার উত্স বা সত্যতা যাচাই করতে ব্যবহৃত হয়। মরিয়মের যখন ঝনকে একটি মুক্ত বার্তা প্রেরণের প্রয়োজন হয় এবং তার বার্তাটি অবশ্যই মেরির কাছ থেকে আসে তা যাচাই করতে হবে, এইচএস 256 বা আরএস 256 ব্যবহার করা যেতে পারে।

এইচএস 256 একটি একক কী ব্যবহার করে ডেটার প্রদত্ত নমুনার জন্য একটি স্বাক্ষর তৈরি করতে পারে। স্বাক্ষর সহ বার্তাটি প্রেরণ করা হলে, প্রাপ্ত দলটি স্বাক্ষরটির বার্তার সাথে মেলে কিনা তা যাচাই করতে একই কীটি ব্যবহার করতে পারে।

আরএস 256 একই কাজ করতে জোড়া জোড়া কী ব্যবহার করে। স্বাক্ষরটি কেবলমাত্র ব্যক্তিগত কী ব্যবহার করে তৈরি করা যেতে পারে। এবং স্বাক্ষরটি যাচাই করতে সর্বজনীন কী ব্যবহার করতে হবে। এই দৃশ্যে, জ্যাক যদি জনসাধারণের কীটি সন্ধান করেও, তিনি মেরির ছদ্মবেশ ধারণের জন্য একটি স্বাক্ষর সহ একটি ছলছানা বার্তা তৈরি করতে পারবেন না।


38

পারফরম্যান্সে পার্থক্য রয়েছে।

সরলভাবে বলা HS256হয় RS256যাচাইয়ের চেয়ে মাত্রার প্রায় 1 ক্রমশ দ্রুত তবে প্রায় 2 ক্রম RS256জারি (স্বাক্ষর) এর চেয়ে দ্রুততর ।

 640,251  91,464.3 ops/s
  86,123  12,303.3 ops/s (RS256 verify)
   7,046   1,006.5 ops/s (RS256 sign)

আসল সংখ্যাগুলিতে ঝাঁকুনি খাবেন না, কেবল একে অপরের প্রতি শ্রদ্ধার সাথে চিন্তা করুন।

[Program.cs]

class Program
{
    static void Main(string[] args)
    {
        foreach (var duration in new[] { 1, 3, 5, 7 })
        {
            var t = TimeSpan.FromSeconds(duration);

            byte[] publicKey, privateKey;

            using (var rsa = new RSACryptoServiceProvider())
            {
                publicKey = rsa.ExportCspBlob(false);
                privateKey = rsa.ExportCspBlob(true);
            }

            byte[] key = new byte[64];

            using (var rng = new RNGCryptoServiceProvider())
            {
                rng.GetBytes(key);
            }

            var s1 = new Stopwatch();
            var n1 = 0;

            using (var hs256 = new HMACSHA256(key))
            {
                while (s1.Elapsed < t)
                {
                    s1.Start();
                    var hash = hs256.ComputeHash(privateKey);
                    s1.Stop();
                    n1++;
                }
            }

            byte[] sign;

            using (var rsa = new RSACryptoServiceProvider())
            {
                rsa.ImportCspBlob(privateKey);

                sign = rsa.SignData(privateKey, "SHA256");
            }

            var s2 = new Stopwatch();
            var n2 = 0;

            using (var rsa = new RSACryptoServiceProvider())
            {
                rsa.ImportCspBlob(publicKey);

                while (s2.Elapsed < t)
                {
                    s2.Start();
                    var success = rsa.VerifyData(privateKey, "SHA256", sign);
                    s2.Stop();
                    n2++;
                }
            }

            var s3 = new Stopwatch();
            var n3 = 0;

            using (var rsa = new RSACryptoServiceProvider())
            {
                rsa.ImportCspBlob(privateKey);

                while (s3.Elapsed < t)
                {
                    s3.Start();
                    rsa.SignData(privateKey, "SHA256");
                    s3.Stop();
                    n3++;
                }
            }

            Console.WriteLine($"{s1.Elapsed.TotalSeconds:0} {n1,7:N0} {n1 / s1.Elapsed.TotalSeconds,9:N1} ops/s");
            Console.WriteLine($"{s2.Elapsed.TotalSeconds:0} {n2,7:N0} {n2 / s2.Elapsed.TotalSeconds,9:N1} ops/s");
            Console.WriteLine($"{s3.Elapsed.TotalSeconds:0} {n3,7:N0} {n3 / s3.Elapsed.TotalSeconds,9:N1} ops/s");

            Console.WriteLine($"RS256 is {(n1 / s1.Elapsed.TotalSeconds) / (n2 / s2.Elapsed.TotalSeconds),9:N1}x slower (verify)");
            Console.WriteLine($"RS256 is {(n1 / s1.Elapsed.TotalSeconds) / (n3 / s3.Elapsed.TotalSeconds),9:N1}x slower (issue)");

            // RS256 is about 7.5x slower, but it can still do over 10K ops per sec.
        }
    }
}

এগুলি গুরুত্বপূর্ণ সংখ্যা। ধন্যবাদ. আমি এনক্রিপশনটিকে কম বা স্বচ্ছ আর্ট থ্রুপুট হিসাবে ভাবতে চাই, তবে আপনার গবেষণায় বোঝা যাচ্ছে যে আন্তঃমন্ত্রক যোগাযোগগুলিতে স্বাক্ষর করতে R256 ব্যবহার করে প্রতি হ্যাপে 1 এমএস যুক্ত হয়।
ম্যাথু মার্ক মিলার

1
@ ম্যাথেজমার্কমিলার মনে রাখবেন যে তারা ব্যবহারে সমান নয়। তাদের বিভিন্ন বৈশিষ্ট্য রয়েছে। আরএস 256 অসম্পূর্ণ এবং তাই ক্লায়েন্ট / সার্ভার শৈলীর যোগাযোগের ক্ষেত্রে আপনি কেবল সর্বজনীন কী ভাগ করেন, এটি একটি ভাল বিকল্প। এইচএস 256 এর জন্য কীটি ভাগ করা দরকার যা উভয় স্বাক্ষর করতে পারে এবং যাচাই করতে পারে - কেবলমাত্র তখনই কার্যকর যদি আপনি দুটি পক্ষকে বিশ্বাস করেন বা কোনও কিছুকে ডিক্রিপ্ট করার জন্য কোনও পক্ষের প্রয়োজন না হয়।
রব ইভান্স

7
@ রোবেভানস হ্যাঁ, এখানে পারফরম্যান্সের সংখ্যায় ঝুঁকবেন না। আপনার সমস্যার সঠিক সমাধান চয়ন করুন। এটি কেবলমাত্র একটি পর্যবেক্ষণ, আরএস 256 এর চেয়ে এইচএস 256 এর পক্ষে নেওয়ার প্রস্তাব নয় আপনার প্রসঙ্গের ভিত্তিতে আপনাকে অবশ্যই এই সিদ্ধান্ত নিতে হবে।
জন লিডেগ্রেন

1
প্রোটোকল পছন্দটি কেবলমাত্রার অতিরিক্ত কিলোমিটারের মতো লেটেন্সিতে একই প্রভাব ফেলতে পারে, এটি বিশেষত দীর্ঘ কল চেইন এবং টাইট টিটিএলগুলির আজকের দিনে জেনে রাখা উচিত।
ম্যাথিউ মার্ক মিলার

0

সংক্ষিপ্ত উত্তর, OAuth2 এর সাথে নির্দিষ্ট,

  • টোকেন স্বাক্ষর জেনারেট করার জন্য এইচএস 256 ব্যবহারকারী ক্লায়েন্ট সিক্রেট এবং একই গোপন ব্যাক- এন্ডে টোকেনটি বৈধকরণের প্রয়োজন। সুতরাং স্বাক্ষরটি যাচাই করতে আপনার ব্যাক-এন্ড সার্ভারে সেই গোপনীয়তার একটি অনুলিপি থাকা উচিত।
  • আরএস 256 টোকেনটিতে স্বাক্ষর করতে সর্বজনীন কী এনক্রিপশন ব্যবহার করুন S স্বাক্ষর (হ্যাশ) ব্যক্তিগত কী ব্যবহার করে তৈরি করবে এবং এটি পাবলিক কী ব্যবহার করে যাচাই করতে পারে। সুতরাং, ব্যাক-এন্ড সার্ভারে সঞ্চয় করার জন্য ব্যক্তিগত কী বা ক্লায়েন্ট গোপনীয়তার প্রয়োজন নেই, তবে ব্যাক-এন্ড সার্ভারটি আপনার ভাড়াটে ( https: // [ভাড়াটে] /. ওয়েল-অজ্ঞাত / ওপেনিডে ওপেনিড কনফিগারেশন url থেকে সর্বজনীন কী আনবে will -কনফিগারেশন ) টোকেন যাচাই করতে। অ্যাক্সেস_টেকনের ভিতরে থাকা কেআইডি প্যারামিটারগুলি ওপেনআইড-কনফিগারেশন থেকে সঠিক কী (পাবলিক) সনাক্ত করতে ব্যবহার করবে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.