URL এবং হ্যাশিং

এই নথিটি নিম্নলিখিত পদ্ধতিতে প্রযোজ্য: আপডেট API (v4) : fullHashes.find

ওভারভিউ

নিরাপদ ব্রাউজিং তালিকা পরিবর্তনশীল দৈর্ঘ্য SHA256 হ্যাশ নিয়ে গঠিত ( তালিকা বিষয়বস্তু দেখুন)। একটি নিরাপদ ব্রাউজিং তালিকার বিপরীতে একটি URL পরীক্ষা করতে (স্থানীয়ভাবে বা সার্ভারে), ক্লায়েন্টদের প্রথমে সেই URL এর হ্যাশ উপসর্গ গণনা করতে হবে।

একটি URL এর হ্যাশ উপসর্গ গণনা করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. ইউআরএল ক্যানোনিকালাইজ করুন ( কনোনিকালাইজেশন দেখুন)।
  2. URL-এর জন্য প্রত্যয়/প্রিফিক্স এক্সপ্রেশন তৈরি করুন ( প্রত্যয়/প্রিফিক্স এক্সপ্রেশন দেখুন)।
  3. প্রতিটি প্রত্যয়/প্রিফিক্স এক্সপ্রেশনের জন্য পূর্ণ-দৈর্ঘ্যের হ্যাশ গণনা করুন ( হ্যাশ গণনা দেখুন)।
  4. প্রতিটি পূর্ণ-দৈর্ঘ্যের হ্যাশের জন্য হ্যাশ উপসর্গ গণনা করুন ( হ্যাশ উপসর্গ গণনা দেখুন)।

মনে রাখবেন যে এই পদক্ষেপগুলি নিরাপদ ব্রাউজিং সার্ভার নিরাপদ ব্রাউজিং তালিকা বজায় রাখার জন্য যে প্রক্রিয়াটি ব্যবহার করে তা প্রতিফলিত করে৷

ক্যানোনিকালাইজেশন

শুরু করার জন্য, আমরা ধরে নিই যে ক্লায়েন্ট URLটিকে পার্স করেছে এবং RFC 2396 অনুযায়ী এটি বৈধ করেছে৷ যদি URLটি একটি আন্তর্জাতিক ডোমেন নাম (IDN) ব্যবহার করে, তাহলে ক্লায়েন্টকে URLটিকে ASCII Punycode উপস্থাপনায় রূপান্তর করতে হবে৷ URL একটি পাথ উপাদান অন্তর্ভুক্ত করা আবশ্যক; অর্থাৎ, এর একটি ট্রেলিং স্ল্যাশ থাকতে হবে ("http://google.com/")।

প্রথমে, URL থেকে ট্যাব (0x09), CR (0x0d), এবং LF (0x0a) অক্ষরগুলি সরান৷ এই অক্ষরগুলির জন্য এস্কেপ সিকোয়েন্সগুলি সরান না (যেমন '%0a')।

দ্বিতীয়ত, যদি URL একটি খণ্ডে শেষ হয়, তাহলে খণ্ডটি সরান। উদাহরণস্বরূপ, "http://google.com/#frag" কে "http://google.com/" এ ছোট করুন।

তৃতীয়ত, বারবার ইউআরএল-কে পার্সেন্ট-আনস্কেপ করুন যতক্ষণ না এতে আর শতাংশ-এস্কেপ না হয়।

হোস্টনামটিকে ক্যানোনিকালাইজ করতে:

URL থেকে হোস্টনাম বের করুন এবং তারপর:

  1. সমস্ত অগ্রণী এবং পিছনের বিন্দুগুলি সরান৷
  2. একটি একক বিন্দু দিয়ে পরপর বিন্দু প্রতিস্থাপন করুন।
  3. যদি হোস্টনামটি একটি IP ঠিকানা হিসাবে পার্স করা যায়, তাহলে এটিকে 4 ডট-বিভাজিত দশমিক মানগুলিতে স্বাভাবিক করুন। ক্লায়েন্টকে অক্টাল, হেক্স এবং চারটিরও কম উপাদান সহ যেকোনো আইনি আইপি-ঠিকানা এনকোডিং পরিচালনা করা উচিত।
  4. পুরো স্ট্রিং ছোট হাতের অক্ষর.

পথটিকে আদর্শীকরণ করতে:

  1. "/./" কে "/" দিয়ে প্রতিস্থাপন করে এবং পূর্ববর্তী পাথ উপাদান সহ "/../" সরিয়ে দিয়ে পাথের "/../" এবং "/./" ক্রমগুলি সমাধান করুন৷
  2. একটানা স্ল্যাশের রানগুলিকে একটি একক স্ল্যাশ অক্ষর দিয়ে প্রতিস্থাপন করুন।

ক্যোয়ারী প্যারামিটারে এই পাথ ক্যানোনিকালাইজেশন প্রয়োগ করবেন না।

URL-এ, <= ASCII 32, >= 127, "#", বা "%" অক্ষরগুলি শতাংশ-এস্কেপ করুন। এস্কেপগুলিতে বড় হাতের হেক্স অক্ষর ব্যবহার করা উচিত।

একটি ক্যানোনিকালাইজেশন বাস্তবায়ন যাচাই করতে সাহায্য করার জন্য নীচে পরীক্ষাগুলি রয়েছে৷

Canonicalize("http://host/%25%32%35") = "http://host/%25";
Canonicalize("http://host/%25%32%35%25%32%35") = "http://host/%25%25";
Canonicalize("http://host/%2525252525252525") = "http://host/%25";
Canonicalize("http://host/asdf%25%32%35asd") = "http://host/asdf%25asd";
Canonicalize("http://host/%%%25%32%35asd%%") = "http://host/%25%25%25asd%25%25";
Canonicalize("http://www.google.com/") = "http://www.google.com/";
Canonicalize("http://%31%36%38%2e%31%38%38%2e%39%39%2e%32%36/%2E%73%65%63%75%72%65/%77%77%77%2E%65%62%61%79%2E%63%6F%6D/") = "http://168.188.99.26/.secure/www.ebay.com/";
Canonicalize("http://195.127.0.11/uploads/%20%20%20%20/.verify/.eBaysecure=updateuserdataxplimnbqmn-xplmvalidateinfoswqpcmlx=hgplmcx/") = "http://195.127.0.11/uploads/%20%20%20%20/.verify/.eBaysecure=updateuserdataxplimnbqmn-xplmvalidateinfoswqpcmlx=hgplmcx/";
Canonicalize("http://host%23.com/%257Ea%2521b%2540c%2523d%2524e%25f%255E00%252611%252A22%252833%252944_55%252B") = "http://host%23.com/~a!b@c%23d$e%25f^00&11*22(33)44_55+";
Canonicalize("http://3279880203/blah") = "http://195.127.0.11/blah";
Canonicalize("http://www.google.com/blah/..") = "http://www.google.com/";
Canonicalize("www.google.com/") = "http://www.google.com/";
Canonicalize("www.google.com") = "http://www.google.com/";
Canonicalize("http://www.evil.com/blah#frag") = "http://www.evil.com/blah";
Canonicalize("http://www.GOOgle.com/") = "http://www.google.com/";
Canonicalize("http://www.google.com.../") = "http://www.google.com/";
Canonicalize("http://www.google.com/foo\tbar\rbaz\n2") ="http://www.google.com/foobarbaz2";
Canonicalize("http://www.google.com/q?") = "http://www.google.com/q?";
Canonicalize("http://www.google.com/q?r?") = "http://www.google.com/q?r?";
Canonicalize("http://www.google.com/q?r?s") = "http://www.google.com/q?r?s";
Canonicalize("http://evil.com/foo#bar#baz") = "http://evil.com/foo";
Canonicalize("http://evil.com/foo;") = "http://evil.com/foo;";
Canonicalize("http://evil.com/foo?bar;") = "http://evil.com/foo?bar;";
Canonicalize("http://\x01\x80.com/") = "http://%01%80.com/";
Canonicalize("http://notrailingslash.com") = "http://notrailingslash.com/";
Canonicalize("http://www.gotaport.com:1234/") = "http://www.gotaport.com/";
Canonicalize("  http://www.google.com/  ") = "http://www.google.com/";
Canonicalize("http:// leadingspace.com/") = "http://%20leadingspace.com/";
Canonicalize("http://%20leadingspace.com/") = "http://%20leadingspace.com/";
Canonicalize("%20leadingspace.com/") = "http://%20leadingspace.com/";
Canonicalize("https://www.securesite.com/") = "https://www.securesite.com/";
Canonicalize("http://host.com/ab%23cd") = "http://host.com/ab%23cd";
Canonicalize("http://host.com//twoslashes?more//slashes") = "http://host.com/twoslashes?more//slashes";

প্রত্যয়/প্রিফিক্স এক্সপ্রেশন

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

প্রত্যয়/প্রিফিক্স এক্সপ্রেশন সমতুল্য রেগুলার এক্সপ্রেশন
a.b/mypath/
http\:\/\/.*\.a\.b\/mypath\/.*
c.d/full/path.html?myparam=a
http\:\/\/.*.c\.d\/full\/path\.html?myparam=a

ক্লায়েন্ট 30টি পর্যন্ত বিভিন্ন সম্ভাব্য হোস্ট প্রত্যয় এবং পথ উপসর্গ সমন্বয় গঠন করবে। এই সমন্বয় শুধুমাত্র URL এর হোস্ট এবং পাথ উপাদান ব্যবহার করে। স্কিম, ব্যবহারকারীর নাম, পাসওয়ার্ড এবং পোর্ট বাতিল করা হয়েছে। যদি URL-এ ক্যোয়ারী প্যারামিটার থাকে, তাহলে অন্তত একটি সংমিশ্রণে সম্পূর্ণ পাথ এবং ক্যোয়ারী প্যারামিটার অন্তর্ভুক্ত থাকবে।

হোস্টের জন্য , ক্লায়েন্ট সর্বোচ্চ পাঁচটি ভিন্ন স্ট্রিং চেষ্টা করবে। তারা হল:

  • URL-এ সঠিক হোস্টনাম।
  • শেষ পাঁচটি উপাদান দিয়ে শুরু করে এবং পর্যায়ক্রমে শীর্ষস্থানীয় উপাদানটি সরিয়ে দিয়ে চারটি হোস্টনাম তৈরি হয়। শীর্ষ-স্তরের ডোমেন এড়িয়ে যেতে পারে। হোস্ট একটি IP ঠিকানা হলে এই অতিরিক্ত হোস্টনাম চেক করা উচিত নয়।

পথের জন্য , ক্লায়েন্ট সর্বোচ্চ ছয়টি ভিন্ন স্ট্রিং চেষ্টা করবে। তারা হল:

  • ক্যোয়ারী প্যারামিটার সহ URL-এর সঠিক পথ।
  • ক্যোয়ারী প্যারামিটার ছাড়াই URL-এর সঠিক পথ।
  • চারটি পাথ রুট (/) থেকে শুরু করে এবং একটি ট্রেইলিং স্ল্যাশ সহ পর্যায়ক্রমে পাথ উপাদান যুক্ত করে গঠিত হয়।

নিম্নলিখিত উদাহরণগুলি চেকের আচরণকে চিত্রিত করে:

URL-এর জন্য http://abc/1/2.html?param=1 , ক্লায়েন্ট এই সম্ভাব্য স্ট্রিংগুলি চেষ্টা করবে:

a.b.c/1/2.html?param=1
a.b.c/1/2.html
a.b.c/
a.b.c/1/
b.c/1/2.html?param=1
b.c/1/2.html
b.c/
b.c/1/

URL http://abcdefg/1.html এর জন্য, ক্লায়েন্ট এই সম্ভাব্য স্ট্রিংগুলি চেষ্টা করবে:

a.b.c.d.e.f.g/1.html
a.b.c.d.e.f.g/
(Note: skip b.c.d.e.f.g, since we'll take only the last five hostname components, and the full hostname)
c.d.e.f.g/1.html
c.d.e.f.g/
d.e.f.g/1.html
d.e.f.g/
e.f.g/1.html
e.f.g/
f.g/1.html
f.g/

URL http://1.2.3.4/1/ এর জন্য, ক্লায়েন্ট এই সম্ভাব্য স্ট্রিংগুলি চেষ্টা করবে:

1.2.3.4/1/
1.2.3.4/

হ্যাশ গণনা

একবার প্রত্যয়/প্রিফিক্স এক্সপ্রেশনের সেট তৈরি হয়ে গেলে, পরবর্তী ধাপ হল প্রতিটি এক্সপ্রেশনের জন্য পূর্ণ-দৈর্ঘ্যের SHA256 হ্যাশ গণনা করা। একটি ইউনিট পরীক্ষা (ছদ্ম-সি-তে) আপনি আপনার হ্যাশ গণনা যাচাই করতে ব্যবহার করতে পারেন নীচে প্রদান করা হয়েছে।

FIPS-180-2 থেকে উদাহরণ:

Unit Test (in pseudo-C)

// Example B1 from FIPS-180-2
string input1 = "abc";
string output1 = TruncatedSha256Prefix(input1, 32);
int expected1[] = { 0xba, 0x78, 0x16, 0xbf };
assert(output1.size() == 4);  // 4 bytes == 32 bits
for (int i = 0; i < output1.size(); i++) assert(output1[i] == expected1[i]);

// Example B2 from FIPS-180-2
string input2 = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
string output2 = TruncatedSha256Prefix(input2, 48);
int expected2[] = { 0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06 };
assert(output2.size() == 6);
for (int i = 0; i < output2.size(); i++) assert(output2[i] == expected2[i]);

// Example B3 from FIPS-180-2
string input3(1000000, 'a');  // 'a' repeated a million times
string output3 = TruncatedSha256Prefix(input3, 96);
int expected3[] = { 0xcd, 0xc7, 0x6e, 0x5c, 0x99, 0x14, 0xfb, 0x92,
                    0x81, 0xa1, 0xc7, 0xe2 };
assert(output3.size() == 12);
for (int i = 0; i < output3.size(); i++) assert(output3[i] == expected3[i]);

হ্যাশ উপসর্গ গণনা

অবশেষে, ক্লায়েন্টকে প্রতিটি পূর্ণ-দৈর্ঘ্যের SHA256 হ্যাশের জন্য হ্যাশ উপসর্গ গণনা করতে হবে। নিরাপদ ব্রাউজিংয়ের জন্য, একটি হ্যাশ উপসর্গ একটি SHA256 হ্যাশের সবচেয়ে উল্লেখযোগ্য 4-32 বাইট নিয়ে গঠিত।

FIPS-180-2 থেকে উদাহরণ:

  • FIPS-180-2 থেকে উদাহরণ B1
    • ইনপুট হল "abc"।
    • SHA256 ডাইজেস্ট হল ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad।
    • 32-বিট হ্যাশ প্রিফিক্স হল ba7816bf।
  • FIPS-180-2 থেকে উদাহরণ B2
    • ইনপুট হল "abcdbcdecdefdefgefghfghfghighighijhijkijkljklmklmnlmnomnopnopq"।
    • SHA256 ডাইজেস্ট হল 248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1।
    • 48-বিট হ্যাশ প্রিফিক্স হল 248d6a61 d206।