সরাসরি পর্বে যান
পর্ব ১৪ · ৮০-এর মধ্যে · মডিউল ২

Cryptography-র সাধারণ ভুল — নিজে না বানানো, key management আর post-quantum

Common Cryptography Mistakes — Vetted Libraries, Key Management & Post-Quantum Migration

Taught in Bangla, this lesson explains why not to build your own crypto, ten common mistakes with fixes and how to catch them in code review, side channels and constant-time habits, the key lifecycle following NIST SP 800-57, envelope encryption with KMS and HSM, key rotation, crypto agility, what quantum computers threaten, and a post-quantum migration plan for an organisation.

এই পর্বে যা শিখবেন

  • কেন নিজে crypto বানানো বিপজ্জনক, আর কোন ধরনের library বেছে নেবেন
  • দশটি সাধারণ ভুল চেনা, প্রতিটির সমাধানসহ, আর code review-তে সেগুলো ধরা
  • Side channel আর constant-time অভ্যাসের ধারণা
  • NIST SP 800-57 ধরে key-এর পুরো জীবনচক্র, envelope encryption, KMS আর HSM
  • Crypto agility আর একটি প্রতিষ্ঠানের post-quantum migration পরিকল্পনা

১ · নিজে বানাবেন না — Cryptography কেন আলাদা

পর্ব ০৮ থেকে পর্ব ১৩ পর্যন্ত আপনি ভালো হাতিয়ারগুলো চিনেছেন: AES, SHA-2, HMAC, RSA, TLS, Argon2. এই পর্বের প্রশ্ন অন্য। ভালো হাতিয়ার থাকার পরেও সিস্টেম ভাঙে কেন? তত্ত্বের ঝালাই চাইলে Computer Networks কোর্সের cryptography পর্ব দেখে নিতে পারেন।

ধরুন একজন দক্ষ কাঠমিস্ত্রি ভাবলেন, “নিজের বাড়ির তালা নিজেই বানাই।” তালাটি দেখতে মজবুত, চাবিও ঘোরে, তিনি নিজেও খুলতে পারলেন না। তাতে কি প্রমাণ হলো তালাটি নিরাপদ? না। তিনি শুধু জানলেন, তিনি নিজে খুলতে পারেননি। একজন তালা-বিশেষজ্ঞ হয়তো এক মিনিটে খুলবেন। ভালো তালা ভালো হয় বহু বিশেষজ্ঞ বহু বছর ধরে ভাঙার চেষ্টা করেও না পারায়।

Bruce Schneier ১৯৯৮ সালে এই কথাটিই বলেছিলেন, যা এখন Schneier’s Law নামে পরিচিত: যে কেউ এমন নিরাপত্তা-ব্যবস্থা বানাতে পারে, যা সে নিজে ভাঙতে পারে না। Roll your own crypto মানে ঠিক এই ফাঁদে পড়া। Cryptography-র ভুলের তিনটি বৈশিষ্ট্য একে সাধারণ bug থেকে আলাদা করে:

  • ভুল চোখে পড়ে না। ভাঙা encryption-এর ফলও এলোমেলোই দেখায়। সব test পাস করে, কারণ decrypt করলে মূল লেখা ঠিকই ফেরে।
  • প্রতিপক্ষ বুদ্ধিমান। সাধারণ bug এলোমেলো ইনপুটে ধরা পড়ে। নিরাপত্তার bug খোঁজেন এমন মানুষ, যিনি ঠিক দুর্বল জায়গাটিই খুঁজছেন।
  • ক্ষতি দেরিতে জানা যায়। চুরি হওয়া ciphertext বছর পরে ভাঙলে আপনি কোনো alert-ই পাবেন না।
তিন স্তরে “নিজে বানাবেন না”

১. Algorithm নয়: নিজের cipher বা hash নয়। ২. Protocol নয়: নিজের handshake বা “AES + কিছু একটা” জোড়াতালি নয়। ৩. Implementation নয়: নিজে AES লেখা নয়, কারণ স্ট্যান্ডার্ড মেনে লিখলেও side channel থেকে যায়। শেখার জন্য খেলনা cipher লেখা ভালো অভ্যাস, শুধু production-এ নয়।

তাহলে কী ব্যবহার করবেন? নিচের তালিকা উদাহরণ, কোনো সুপারিশ নয়। আপনার ভাষা আর প্রয়োজন অনুযায়ী বর্তমান ডকুমেন্টেশন দেখে সিদ্ধান্ত নিন।

প্রয়োজনউদাহরণকেন উল্লেখযোগ্য
সহজ, ভুল করা কঠিন এমন APIlibsodium, TinkMode বা nonce নিজে বাছতে হয় না বা কম হয়
ভাষার standard libraryPython secrets, hmac; Go crypto/*; Java JCA; .NET System.Security.Cryptographyভাষার সাথেই আসে, আপডেট পায়
BrowserWeb Crypto APIBrowser-এর ভেতরের যাচাই করা implementation
নিচু স্তরের কাজOpenSSL, Python cryptographyক্ষমতা বেশি, ভুলের সুযোগও বেশি

Library বাছার সময় পাঁচটি প্রশ্ন করুন: নিয়মিত আপডেট হয় কি? স্বাধীন audit হয়েছে কি? নিরাপত্তা-সমস্যা জানানোর পথ আছে কি? ডিফল্ট আচরণ নিরাপদ কি? ভুল ব্যবহার করলে error দেয়, না চুপ থাকে? আর যাচাই-না-করা package বসালে যে ঝুঁকি তৈরি হয়, সেটি পর্ব ৪৮-এর বিষয়।

২ · দশটি সাধারণ ভুল আর প্রতিটির সমাধান

এই তালিকাটি code review-র চেকলিস্ট হিসেবে ব্যবহার করতে পারেন। প্রতিটি সারিতে ভুলের ধারণা আর তার সমাধান আছে। কীভাবে কেউ এই ভুল কাজে লাগায়, সে ধাপ এই কোর্সে নেই। অন্যের সিস্টেমে এসব পরীক্ষা করা অনুমতি ছাড়া অপরাধ হতে পারে, তাই পর্ব ০৬ মনে রাখবেন।

ভুলকেন বিপদসমাধান
ECB modeএকই block সবসময় একই ciphertext দেয়, তাই ডেটার নকশা বাইরে থেকেই বোঝা যায়AES-GCM বা ChaCha20-Poly1305
Nonce আবার ব্যবহারএকই key-তে একই nonce মানে একই keystream. GCM-এ গোপনীয়তার সাথে tag-এর সুরক্ষাও ভাঙেপ্রতি message-এ নতুন nonce, বা counter; আর ঝুঁকি বেশি হলে AES-GCM-SIV
Tag ছাড়া encryptionগোপন থাকলেও কেউ ciphertext বদলালে ধরা পড়ে নাAEAD ব্যবহার করুন
সাধারণ random দিয়ে keyrandom বা Math.random পূর্বাভাসযোগ্য হতে পারেCSPRNG: secrets, getRandomValues
কোডে key লেখাRepository, build আর backup-এ key ছড়িয়ে যায়, বদলানোও কঠিনKMS বা secret manager (বিস্তারিত)
নিরাপত্তায় MD5 বা SHA-1Collision বানানো সম্ভব বলে প্রমাণিত (পর্ব ০৯)SHA-256 বা SHA-3; password-এ Argon2 (পর্ব ১৩)
Secret-এর তুলনায় ==প্রথম অমিলেই থেমে যায়, সময়ের পার্থক্য তথ্য ফাঁস করতে পারেhmac.compare_digest জাতীয় constant-time তুলনা
Certificate যাচাই বন্ধEncryption থাকে, কিন্তু কার সাথে কথা হচ্ছে তা অজানাযাচাই চালু রেখে CA bundle বা সময়ের সমস্যা ঠিক করুন
Tag দেখার আগে decryptযাচাই-না-হওয়া ডেটা নিয়ে কাজ শুরু হয়, error থেকে তথ্য ফাঁস হতে পারেAEAD API যা যাচাই না হলে plaintext-ই দেয় না
Downgrade-এর সুযোগ রাখাপুরোনো দুর্বল option খোলা থাকলে সংযোগ সেদিকে নামানো যেতে পারেপুরোনো version বন্ধ, ন্যূনতম TLS 1.2, ভালো হয় 1.3 (পর্ব ১২)

verify=False সবচেয়ে ক্ষতিকর “সমাধান”গুলোর একটি। সংযোগ তখনও encrypted থাকে, তালার ছবিও বদলায় না, অথচ অপর প্রান্তে কে আছে তা আর যাচাই হয় না। পোস্ট অফিসের সিলমোহর না দেখে যে কারও হাতে চিঠি দেওয়ার মতো।

কতবার random nonce নিরাপদ? একটি হিসাব

AES-GCM-এর nonce ৯৬ bit. এলোমেলো nonce নিলে দুটি মিলে যাওয়ার সম্ভাবনা birthday bound মেনে চলে। nটি message-এ সম্ভাবনা মোটামুটি n² / 2^97.

একই key-তে messageহিসাবCollision-এর সম্ভাবনা
232 (প্রায় ৪৩০ কোটি)264 / 297 = 2−33প্রায় ১.১৬ × ১০−১০
240280 / 297 = 2−17প্রায় ৭.৬ × ১০−৬
248সঠিক সূত্র 1 − e^(−0.5)প্রায় ০.৩৯ (৩৯%)

এজন্যই NIST SP 800-38D (২০০৭) এলোমেলো ৯৬-bit nonce-এ একই key দিয়ে encryption-এর সংখ্যা 232-এ সীমিত রাখে। খুব বেশি ডেটা হলে সমাধান key বদলানো, যা আমরা ৬ নম্বর অংশে দেখব। সঠিক ব্যবহার দেখতে সাধারণত এত ছোট:

# উদাহরণ (এই পাতায় চলবে না): Python cryptography package লাগে
import secrets
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

key = AESGCM.generate_key(bit_length=256)  # CSPRNG থেকে; বাস্তবে KMS থেকে আনুন
aead = AESGCM(key)
nonce = secrets.token_bytes(12)            # প্রতি message-এ নতুন
blob = aead.encrypt(nonce, b"hello", b"order-42")  # শেষে tag যুক্ত থাকে
text = aead.decrypt(nonce, blob, b"order-42")      # tag না মিললে InvalidTag

এবার ভুলগুলো চোখে ধরার অনুশীলন। নিচের খেলনা linter কোনো কোড চালায় না, শুধু ১২টি নকল লাইনের লেখা মিলিয়ে দেখে। প্রতিটি নিয়ম উপরের তালিকার এক একটি ভুল। Run চেপে দেখুন, তারপর কোনো লাইন বদলে আবার চালান।

// খেলনা linter: শুধু লেখা (string) মেলায়, কোনো কোড চালায় না। উদাহরণের নামগুলো কাল্পনিক।
const rules = [
  [/MODE_ECB/, 'ECB mode', 'use an AEAD: AES-GCM or ChaCha20-Poly1305'],
  [/nonce\s*=\s*b?["'0]/, 'fixed nonce', 'fresh nonce per message, or use a counter'],
  [/MODE_(CBC|CTR)/, 'no authentication', 'use an AEAD, not bare CBC or CTR'],
  [/random\.(randbytes|random|randint)|Math\.random/, 'non-CSPRNG key', 'use secrets or crypto.getRandomValues'],
  [/(KEY|SECRET|TOKEN)\w*\s*=\s*["']/i, 'hard-coded key', 'load from a KMS or secret manager'],
  [/\b(md5|sha1)\(/i, 'broken hash', 'use SHA-256; for passwords use Argon2id'],
  [/(tag|mac|token)\w*\s*==\s*\w/i, 'secret compared with ==', 'use hmac.compare_digest'],
  [/verify\s*=\s*False|rejectUnauthorized:\s*false/, 'certificate check off', 'keep verify on; fix the CA bundle'],
  [/decrypt\(.*;.*verify/, 'decrypt before tag check', 'verify first, or use an AEAD API'],
  [/TLSv1(_1)?\b(?!\.[23])|allow_downgrade/, 'downgrade option', 'set the minimum version to TLS 1.2 or 1.3'],
];
const code = [
  'cipher = AES.new(k, AES.MODE_ECB)',
  'nonce = b"000000000000"',
  'cipher = AES.new(k, AES.MODE_CBC, iv)',
  'k = random.randbytes(32)',
  'API_KEY = "example-token"',
  'digest = hashlib.md5(data).hexdigest()',
  'if tag == expected: accept()',
  'requests.get(url, verify=False)',
  'plain = decrypt(blob); verify_tag(blob)',
  'ctx.minimum_version = TLSv1_1',
  'nonce = secrets.token_bytes(12)',
  'key = kms.get_data_key("orders")',
];
let found = 0;
code.forEach((line, i) => {
  const hit = rules.find(([re]) => re.test(line));
  if (hit) { found++; console.log(`L${i + 1} ${hit[1]} -> ${hit[2]}`); }
  else console.log(`L${i + 1} ok`);
});
console.log(`${found} of ${code.length} lines flagged`);

আউটপুটের শেষ চার লাইন:

L10 downgrade option -> set the minimum version to TLS 1.2 or 1.3
L11 ok
L12 ok
10 of 12 lines flagged

L1 থেকে L10 প্রতিটি এক একটি ভুল ধরেছে, আর L11 ও L12 নিরাপদ ধরন বলে পাস করেছে। লক্ষ্য করুন, find প্রতি লাইনে শুধু প্রথম মেলা নিয়মটি দেখায়। আসল সীমাটি আরও বড়: লেখা মেলানো দিয়ে যুক্তির ভুল ধরা যায় না। Counter ঠিকমতো না বাড়লে nonce পুনরাবৃত্তি হবে, অথচ কোনো লাইনই সন্দেহজনক দেখাবে না। তাই linter প্রথম ছাঁকনি, মানুষের review-র বিকল্প নয় (code review দেখুন)।

৩ · যে তথ্য অঙ্ক দিয়ে নয়, আচরণ দিয়ে ফাঁস হয়

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

এটাই side channel-এর ধারণা। গণিতে algorithm নিখুঁত হলেও বাস্তব যন্ত্র কাজ করার সময় বাইরে চিহ্ন রেখে যায়। Paul Kocher ১৯৯৬ সালে সময়ের ফাঁস নিয়ে আর ১৯৯৯ সালে সহকর্মীদের সাথে বিদ্যুৎ-খরচের ফাঁস নিয়ে যুগান্তকারী গবেষণা প্রকাশ করেন।

ধরনযা থেকে তথ্য আসেপ্রতিরক্ষা
TimingSecret-এর ওপর নির্ভর করে কাজের সময় বদলানোConstant-time কোড
Power (বিদ্যুৎ)Smart card বা ছোট যন্ত্রের বিদ্যুৎ-খরচের ধরনHardware countermeasure, certified chip, HSM
Cacheএকই CPU ভাগ করা প্রোগ্রাম cache-এর আচরণ থেকে জানতে পারেSecret দিয়ে memory index না করা, AES-NI জাতীয় hardware নির্দেশ, tenant আলাদা রাখা

Constant-time অভ্যাস মানে সময় একেবারে সমান করা নয়। মানে কাজের সময় secret-এর মানের ওপর নির্ভর না করা। নিয়ম তিনটি: secret দেখে if নয়, secret দিয়ে array index নয়, আর secret-কে ভাগের মতো পরিবর্তনশীল-সময়ের নির্দেশে নয়। Compiler কোড বদলে দিতে পারে বলে এটি হাতে লেখা কঠিন। সেজন্য ভাষার দেওয়া function ব্যবহার করুন: Python hmac.compare_digest, Node crypto.timingSafeEqual, Go subtle.ConstantTimeCompare, Java MessageDigest.isEqual, PHP hash_equals.

নিচের কোড কোনো সময় মাপে না। এটি API বেছে নেওয়ার শিক্ষা: দুটি পদ্ধতির উত্তর একই, পার্থক্য তাদের প্রতিশ্রুতিতে। এখানে বসানো key নকল, শুধু উদাহরণ।

import hashlib, hmac

key = b"example-key-not-real"              # নকল key, শুধু উদাহরণ
msg = b"amount=500;to=rahim"
tag = hmac.new(key, msg, hashlib.sha256).digest()
print("tag starts:", tag.hex()[:16])

def verify(message, claimed):
    expected = hmac.new(key, message, hashlib.sha256).digest()
    return hmac.compare_digest(expected, claimed)   # == নয়

print("right tag :", verify(msg, tag))
print("changed   :", verify(b"amount=900;to=rahim", tag))
print("short tag :", verify(msg, tag[:8]))
print("== agrees :", (tag == tag[:8]) == hmac.compare_digest(tag, tag[:8]))

try:
    hmac.compare_digest("৳500", "৳500")      # non-ASCII str
except TypeError as err:
    print("TypeError :", err)
print("bytes ok  :", hmac.compare_digest("৳500".encode(), "৳500".encode()))

আসল আউটপুট:

tag starts: 2f235f012327defd
right tag : True
changed   : False
short tag : False
== agrees : True
TypeError : comparing strings with non-ASCII characters is not supported
bytes ok  : True

সঠিক tag-এ True, আর message বদলালে বা tag কেটে ছোট করলে False. ফলাফলে == আর compare_digest একমত, তাই শুধু test চালিয়ে ভুলটি ধরা যায় না। Review-তে API দেখেই ধরতে হয়। Python-এর ডকুমেন্টেশন অনুযায়ী দৈর্ঘ্য বা ধরন আলাদা হলে দৈর্ঘ্যের তথ্য তাত্ত্বিকভাবে জানা যেতে পারে, মান নয়। SHA-256 tag-এর দৈর্ঘ্য এমনিতেই নির্দিষ্ট, তাই সমস্যা নেই। শেষ দুই লাইন দেখায়, Bangla বা অন্য non-ASCII লেখা সরাসরি দিলে TypeError আসে, তাই আগে bytes-এ বদলাতে হয়।

Padding oracle আর “আগে যাচাই” নিয়ম

Padding oracle একটি ধারণা হিসেবে জানলেই চলবে। পুরোনো CBC mode-এ server যদি “padding ভুল” আর “tag ভুল”, এই দুই অবস্থায় আলাদা আচরণ করে, তবে সেই ছোট পার্থক্যটিই প্রশ্নের উত্তরদাতা (oracle) হয়ে যায়। Serge Vaudenay ২০০২ সালে CBC-র ক্ষেত্রে আর Daniel Bleichenbacher ১৯৯৮ সালে RSA padding-এর ক্ষেত্রে এই শ্রেণির সমস্যা প্রকাশ করেন। প্রতিরক্ষা কৌশল নয়, নকশা: AEAD ব্যবহার করুন, আর সব decrypt ব্যর্থতায় একই সাধারণ error দিন।

Moxie Marlinspike ২০১১ সালে একে “Cryptographic Doom Principle” নাম দেন: tag যাচাইয়ের আগে message-এর ওপর কোনো কাজ করলে, কোনো না কোনোভাবে বিপদ আসবেই। সেজন্য ক্রম সবসময় যাচাই → তারপর decrypt → তারপর ব্যবহার।

৪ · Key management — একটি key-এর জীবনচক্র

Kerckhoffs-এর নীতি (পর্ব ০৭) বলে, শুধু key গোপন থাকলেই সিস্টেম নিরাপদ থাকা উচিত। উল্টো করে ভাবলে, পুরো নিরাপত্তার ভার key-এর ওপর। Key management তাই crypto-র সবচেয়ে কঠিন বাস্তব কাজ। NIST SP 800-57 Part 1 (Rev. 5, ২০২০) এর প্রধান নির্দেশিকা। এর Rev. 6-এর খসড়া ডিসেম্বর ২০২৫-এ প্রকাশ হয়েছে, আর অক্টোবর ২০২৬-এ যাচাই করার সময় পর্যন্ত সেটি খসড়াই ছিল।

একটি key-এর ছয় ধাপ

Key lifecycle, with the compromise path every plan needs

Key lifecycle-এর ছয় ধাপ ১ তৈরিGenerate ২ সংরক্ষণStore ৩ ব্যবহারUse ৪ RotationRotate ৫ বাতিলRevoke ৬ ধ্বংসDestroy ফাঁস হলে সরাসরি বাতিল প্রতিটি ধাপ audit log-এ লেখা হয় কে, কখন, কোন key, কোন উদ্দেশ্যে অস্বাভাবিক ব্যবহার = detection-এর সুযোগ
ছবি ১৪.১ — SP 800-57 নিজে key-এর অবস্থাকে pre-activation, active, suspended, deactivated, compromised আর destroyed নামে ভাগ করে; এই ছয় ধাপ তার সহজ কাজভিত্তিক রূপ।
ধাপযা করবেনযা আটকায়কীভাবে জানবেন
তৈরিCSPRNG বা HSM-এর ভেতরে, যথেষ্ট দৈর্ঘ্যেঅনুমানযোগ্য keyতৈরির পথ আর key-এর ধরন নথিতে আছে
সংরক্ষণKMS, HSM বা secret manager; কোডে বা log-এ নয়Repository ও backup থেকে ফাঁসSecret scanner, access log
ব্যবহারএক key এক উদ্দেশ্যে; least privilegeএক ভুলে সব প্রভাবিত হওয়াকে key ব্যবহার করল তার alert
Rotationনির্দিষ্ট cryptoperiod পরে নতুন versionএকটি key-তে বেশি ডেটা ও বেশি সময়Key-এর বয়সের report
বাতিলফাঁসের সন্দেহ হলেই ব্যবহার বন্ধ, certificate হলে revokeফাঁস হওয়া key-এর দীর্ঘ ব্যবহারবাতিল key-এর ব্যবহার-চেষ্টায় alert
ধ্বংসসব কপি সহ মোছা; অপেক্ষার সময় রাখাপুরোনো backup থেকে ফিরে আসাধ্বংসের প্রমাণ ও অনুমোদন

Cryptoperiod মানে একটি key কতদিন ব্যবহারের অনুমতি পাবে। উত্তর একটি নয়। এটি নির্ভর করে key কতটা ডেটা রক্ষা করে, ফাঁসের ক্ষতি কত, আর বদলাতে কতটা ঝামেলা, তার ওপর। SP 800-57 ধরনভেদে পরামর্শ দেয়। “এক বছরই সবসময় ঠিক” বলা ভুল হবে। Separation of duties-ও এখানে কাজে লাগে: key-এর প্রশাসক আর key-এর ব্যবহারকারী আলাদা মানুষ বা role হওয়া ভালো।

৫ · Envelope encryption, KMS আর HSM

ব্যাংকের লকারের কথা ভাবুন। আপনার গয়না (data) লকারে, লকারের চাবি (DEK) একটি সিলমোহর করা খামে। সেই খাম খুলতে পারে শুধু ব্যাংকের ভল্টে থাকা মাস্টার চাবি (KEK), আর ভল্ট কখনো ব্যাংকের বাইরে যায় না। মাস্টার চাবি বদলাতে হলে গয়না ছুঁতে হয় না, শুধু খামগুলো নতুন করে সিল করতে হয়।

Envelope encryption-এ data encrypt হয় DEK (Data Encryption Key) দিয়ে, আর DEK encrypt হয় KEK (Key Encryption Key) দিয়ে। এভাবে তৈরি হয় key hierarchy. এর চারটি সুবিধা: বড় data দ্রুত encrypt হয়, KEK কখনো বাইরে যায় না, প্রতিটি object আলাদা DEK পায় বলে blast radius ছোট থাকে, আর KEK ব্যবহারের প্রতিটি অনুরোধ log-এ ধরা পড়ে। Cloud-এ এর বাস্তব রূপ, খরচ আর caching Cloud & DevOps কোর্সের secrets ও KMS পর্বে আছে, তাই এখানে আমরা নীতিতেই থাকব।

Key hierarchy — যত ওপরে, তত কম ব্যবহার, তত কড়া পাহারা

Root key in an HSM, KEKs in a KMS, DEKs beside the data

তিন স্তরের key hierarchy HSM KMS Storage Root keyবাইরে যায় না KEK: ordersv1, v2 KEK: documentsv1 Order AOrder BDocument C encrypted dataencrypted dataencrypted data wrapped DEKwrapped DEKwrapped DEK
ছবি ১৪.২ — মোড়ানো DEK data-র পাশেই থাকতে পারে, কারণ KEK ছাড়া সেটি অর্থহীন। আলাদা KEK (orders, documents) থাকায় একটির ঝুঁকি অন্যটিতে ছড়ায় না।

KMS বনাম HSM: HSM (Hardware Security Module) একটি বিশেষ tamper-resistant যন্ত্র, যার ভেতরেই key তৈরি ও ব্যবহার হয়। FIPS 140-3 এর মতো মান দিয়ে এটি যাচাই করা যায়। KMS একটি সেবা বা সফটওয়্যার স্তর, যা permission, log আর rotation সামলায়, আর ভেতরে প্রায়ই HSM ব্যবহার করে। HSM মানেই নিরাপদ ব্যবহার নয়। যে কেউ HSM-কে DEK খুলে দিতে বলতে পারলে key বাইরে না গিয়েও ক্ষতি হয়। তাই permission আর log দুটিই সমান জরুরি।

  1. ApplicationData encrypt করে
  2. KMSKEK এখানেই থাকে
  3. Storageশুধু encrypted জিনিস
খেলনা মান (নিচের simulator-এর আসল আউটপুট)
App-এর memory: data
App-এর memory: DEK
Storage: data
Storage: wrapped DEK
KMS-এর log
  1. শুরু। কাল্পনিক অনলাইন বাজারের application-এ একটি সংবেদনশীল লেখা আছে, nid=example. এখনো কিছু encrypt হয়নি।
  2. DEK চাওয়া। Application KMS-কে নতুন DEK চাইল। KMS দুটি জিনিস দিল: খোলা DEK 2638aecd আর KEK v1 দিয়ে মোড়ানো রূপ 25e94f35. অনুরোধটি log-এ উঠল।
  3. স্থানীয়ভাবে encrypt. বড় data KMS-এ পাঠাতে হয় না। Application নিজের memory-তেই DEK দিয়ে encrypt করছে। বাস্তবে এই ধাপে AEAD ব্যবহার হয়।
  4. খোলা DEK মুছে ফেলা। Storage-এ গেল encrypted data 37c3…f474 আর wrapped DEK 25e94f35. খোলা data আর খোলা DEK দুটোই memory থেকে সরানো হলো। Storage চুরি হলেও এখন KEK ছাড়া কিছু পড়া যাবে না।
  5. Storage-এ শুধু encrypted জিনিস। Database-এর একটি কপি কারও হাতে গেলেও সেখানে খোলা key নেই। Backup-এর ঝুঁকিও এতে কমে।
  6. পড়ার সময় unwrap. Application wrapped DEK KMS-এ পাঠাল। KMS permission যাচাই করে, log লিখে, খোলা DEK 2638aecd ফেরত দিল। KEK কিন্তু KMS ছেড়ে কোথাও যায়নি।
  7. Decrypt, তারপর আবার মোছা। Application লেখাটি ফিরে পেল, আর কাজ শেষে DEK মুছে ফেলল। Log-এ অস্বাভাবিক সংখ্যায় unwrap দেখলে সেটিই ফাঁসের সংকেত হতে পারে।

এবার পুরো ধারণাটি নিজে চালান। নিচের cipher একটি XOR খেলনা, real নয়, শুধু ধারণার জন্য। Key-ও মাত্র ৪ byte, যাতে আউটপুট চোখে পড়ে।

// খেলনা envelope encryption: real নয়, শুধু ধারণার জন্য (XOR keystream)
function mulberry32(a){return()=>{a=a+0x6D2B79F5|0;let t=Math.imul(a^a>>>15,1|a);t=t+Math.imul(t^t>>>7,61|t)^t;return((t^t>>>14)>>>0)/4294967296}}
const rng=mulberry32(2026);
const newKey=()=>Array.from({length:4},()=>Math.floor(rng()*256));
const hex=b=>b.map(x=>x.toString(16).padStart(2,'0')).join('');
const stream=(data,key,nonce)=>{const r=mulberry32(key.reduce((s,b)=>s*257+b>>>0,nonce));return data.map(b=>b^Math.floor(r()*256))};
const bytes=s=>Array.from(s,c=>c.charCodeAt(0)), text=b=>String.fromCharCode(...b);

const kms={keys:{1:newKey()},active:1,n:0};           // KEK কখনো KMS-এর বাইরে যায় না
const wrap=dek=>{const v=kms.active,nonce=++kms.n;return{v,nonce,w:stream(dek,kms.keys[v],nonce)}};
const unwrap=e=>{if(!kms.keys[e.v])throw new Error('KEK v'+e.v+' destroyed');return stream(e.w,kms.keys[e.v],e.nonce)};
function seal(msg){const dek=newKey();return{data:stream(bytes(msg),dek,0),env:wrap(dek)}}
const open=o=>text(stream(o.data,unwrap(o.env),0));
const show=(tag,o)=>console.log(tag,'data='+hex(o.data),'wrappedDEK='+hex(o.env.w),'kek=v'+o.env.v);

const rec=seal('nid=example');
show('sealed :',rec);
console.log('open   :',open(rec));
const before=hex(rec.data);
kms.keys[2]=newKey(); kms.active=2;                   // নতুন KEK version
rec.env=wrap(unwrap(rec.env));                        // শুধু DEK নতুন করে মোড়ানো
show('rewrap :',rec);
console.log('data unchanged?',hex(rec.data)===before);
delete kms.keys[1];                                   // পুরোনো KEK ধ্বংস
console.log('open   :',open(rec));
delete kms.keys[2];                                   // শেষ KEK-ও ধ্বংস
try{open(rec)}catch(e){console.log('open   : FAILED,',e.message)}

আসল আউটপুট:

sealed : data=37c32f1651c1ac7708f474 wrappedDEK=25e94f35 kek=v1
open   : nid=example
rewrap : data=37c32f1651c1ac7708f474 wrappedDEK=ae64bc26 kek=v2
data unchanged? true
open   : nid=example
open   : FAILED, KEK v2 destroyed

Rotation-এর পরে data একই আছে, বদলেছে শুধু wrappedDEK (25e94f35 থেকে ae64bc26). পুরোনো KEK ধ্বংসের পরেও লেখা খোলে, কারণ DEK এখন v2-তে মোড়ানো। শেষ লাইনটি crypto-erasure: সব KEK ধ্বংস হলে ডেটা কার্যত চিরতরে অপাঠ্য। সুবিধা আর বিপদ, দুটোই এই এক লাইনে। ভুলবশত key মুছলে নিজের ডেটাও হারাবেন।

৬ · Key rotation — data না ছুঁয়ে চাবি বদল

Key rotation মানে নির্দিষ্ট সময় পরে বা কোনো ঘটনার পরে পুরোনো key-এর জায়গায় নতুন version আনা। এতে একটি key-তে রক্ষিত ডেটার পরিমাণ সীমিত থাকে, আর ফাঁস হলে ক্ষতির সময়ও ছোট হয়। নিচের stepper-এ ওপরের সেই record-টিই আছে, আর একটি rotation ধাপে ধাপে চলছে।

KMS আর একটি record-এর অবস্থা (খেলনা মান)
Active KEK
KMS-এ আছে
Record: data
Record: wrapped DEK
Record: কোন KEK
Record খোলে?
  1. শুরু। Record-টির DEK KEK v1 দিয়ে মোড়ানো (25e94f35). Record-এর সাথে “kek=v1” লেখা আছে, তাই পড়ার সময় কোন version লাগবে তা জানা যায়।
  2. নতুন version. KMS-এ v2 তৈরি হলো, আর নতুন লেখা এখন থেকে v2 ব্যবহার করবে। v1 মোছা হয়নি, শুধু decrypt-এর জন্য রাখা। তাই record এখনো খোলে, কোনো downtime নেই।
  3. পুরোনো খাম খোলা। Record-এর wrapped DEK KMS-এর ভেতরে v1 দিয়ে খোলা হচ্ছে। অনেক KMS-এ এই কাজ ভেতরেই হয়, খোলা DEK application-এর হাতে আসেই না।
  4. নতুন খামে মোড়ানো। একই DEK এবার v2 দিয়ে মোড়ানো হলো। wrapped DEK হলো ae64bc26. Data 37c3…f474 এক byte-ও বদলায়নি।
  5. সব record যাচাই। সব record, backup আর replica-তে v1-এর ওপর নির্ভরতা শূন্য কি না গুনে দেখা হলো। এই গণনা ছাড়া পরের ধাপে যাওয়া বিপজ্জনক।
  6. পুরোনো version ধ্বংস। অপেক্ষার সময় শেষে v1 ধ্বংস হলো। KMS-এ এখন শুধু v2, আর record আগের মতোই খোলে। Rotation সম্পূর্ণ।

কত সস্তা? একটি হিসাব

ধরুন ১০ লাখ object, প্রতিটি ২ MB, আর গতি ধরে নেওয়া হলো ২০০ MB/s. প্রতিটি wrapped DEK ১০০ byte, আর KMS প্রতি সেকেন্ডে ১,০০০টি অনুরোধ নেয়। এই সব সংখ্যাই ধরে নেওয়া, কোনো পণ্যের মাপ নয়।

পদ্ধতিযত ডেটা নড়েহিসাবসময়
সব data নতুন করে encrypt২ TB১০৬ × ২ MB ÷ ২০০ MB/s = ১০,০০০ sপ্রায় ২.৮ ঘণ্টা
শুধু DEK re-wrap১০০ MB১০৬ ÷ ১,০০০ প্রতি সেকেন্ডে = ১,০০০ sপ্রায় ১৭ মিনিট

অনেক KMS-এ আরও সহজ পথ আছে: পুরোনো version decrypt-এর জন্য রেখে দেওয়া, আর record পড়ার সময় ধীরে ধীরে re-wrap করা।

Rotation সব সমস্যার সমাধান নয়। KEK rotation DEK বদলায় না। খোলা DEK ফাঁস হয়ে থাকলে re-wrap করে কোনো লাভ নেই, তখন data নতুন DEK দিয়ে encrypt করতেই হবে। আবার পুরোনো wrapped DEK-এর কপি কারও কাছে থাকলে v1 যতদিন আছে ততদিন সেটি খোলা সম্ভব। আর উল্টো বিপদ: পুরোনো backup v1-এর ওপর নির্ভর করলে v1 ধ্বংস করা মানে সেই backup হারানো।

ফাঁসের সন্দেহ হলে পরিকল্পিত rotation আর জরুরি বদলের পার্থক্য মনে রাখুন। জরুরি অবস্থায় আগে key-এর ব্যবহার বন্ধ, তারপর audit log দেখে প্রভাবের সীমা ঠিক করা, তারপর নতুন key আর দরকার হলে re-encrypt. পুরো প্রক্রিয়া পর্ব ৬১-এর incident response পরিকল্পনার অংশ হওয়া উচিত।

৭ · Crypto agility — আগামী বদলের জন্য আজকের নকশা

আজকের নিরাপদ algorithm একদিন বিদায় নেবে। MD5, SHA-1, DES, RC4, সবারই এটি ঘটেছে। Crypto agility মানে পুরো সিস্টেম নতুন করে না লিখে algorithm বদলাতে পারার ক্ষমতা। মোবাইল ব্যাংকিংয়ের PIN বদলাতে যেমন নতুন অ্যাকাউন্ট খুলতে হয় না, তেমনি algorithm বদলাতেও পুরো application লেখা উচিত নয়।

  • তালিকা রাখুন। Cryptographic inventory ছাড়া migration শুরুই হয় না: কোন system, কোন algorithm, কোন key, কতদিনের ডেটা, কে মালিক।
  • ডেটার সাথে version লিখুন। Ciphertext-এর শুরুতে format আর key-এর version থাকলে পুরোনো আর নতুন একসাথে চলতে পারে।
  • এক জায়গায় রাখুন। সব crypto একটি ছোট wrapper-এর পেছনে থাকলে বদলাতে হবে এক জায়গায়, শত ফাইলে নয়।
  • Test রাখুন। পুরোনো ডেটা পড়া আর নতুন algorithm-এ লেখা, দুটোরই automated test থাকুক।

Agility মানে ব্যবহারকারীকে option দেওয়া নয়। Connection-এর সময় অনেক algorithm নিয়ে দর-কষাকষি রাখলে সেটিই downgrade-এর দরজা। ভালো নকশায় যেকোনো সময়ে অল্প কয়েকটি শক্ত বিকল্প থাকে, version বদলায় নিয়ন্ত্রিতভাবে, আর পুরোনো option সত্যিই বন্ধ হয়।

৮ · Post-quantum — কী ভাঙবে, কী টিকবে

Post-quantum cryptography মানে এমন algorithm, যা সাধারণ কম্পিউটারেই চলে, কিন্তু বড় quantum computer-এর বিরুদ্ধেও নিরাপদ বলে মনে করা হয়। এটি “quantum কম্পিউটার দিয়ে encryption” নয়। ভয়ের কারণটি হলো দুটি algorithm:

Shor (১৯৯৪)

বড় সংখ্যার গুণনীয়ক আর discrete log, দুটোই লুকানো পর্যাবৃত্তির (period) সমস্যা, আর quantum computer পর্যাবৃত্তি খুঁজতে অসাধারণ। তাই RSA, Diffie-Hellman আর elliptic curve (পর্ব ১০) কার্যত ভেঙে যায়, শুধু key বড় করে বাঁচা যায় না।

Public key: বদলাতেই হবে

Grover (১৯৯৬)

না-সাজানো তালিকায় খোঁজার গতি বাড়ায়, N-এর জায়গায় মোটামুটি √N ধাপ। তাত্ত্বিকভাবে key-এর bit অর্ধেক মনে হয়, তবে এটি সমান্তরালে ভালো চলে না, আর প্রতিটি ধাপ খুব দামি।

Symmetric: টিকে থাকে

একটি সহজ তুলনা। Shor যেন তালার ভেতরের নকশাটিই বুঝে ফেলা, তাই তালাটি বাতিল। Grover যেন একই চাবির গোছায় একটু দ্রুত হাত চালানো, তাই গোছা বড় হলেই চলে।

Algorithmপ্রধান ঝুঁকিকরণীয়
RSA, ECDH, ECDSA, Ed25519Shor: কার্যত ভাঙেML-KEM, ML-DSA, SLH-DSA-তে migration
AES-128Grover: তত্ত্বে প্রায় 264 ধাপ, বাস্তবে অনেক কঠিনNIST-এর Category 1 মান পূরণ করে বলে ধরা হয়; দীর্ঘ মেয়াদে AES-256 বেছে নিতে পারেন
AES-256, SHA-256, SHA-3বাস্তব ঝুঁকি কমবদলানোর দরকার নেই
HMAC-SHA-256বাস্তব ঝুঁকি কমবদলানোর দরকার নেই

এজন্যই symmetric key-এর আকার খুব একটা চিন্তার বিষয় নয়। NIST IR 8547-এ বলা আছে, অন্তত ১২৮-bit ক্ল্যাসিক্যাল শক্তির সব অনুমোদিত symmetric primitive অন্তত Category 1-এর শর্ত পূরণ করে বলে মনে করা হয়। “AES-128 এখন অর্ধেক শক্তির, তাই অকেজো” কথাটি অতি সরলীকরণ।

নতুন মান: FIPS 203, 204, 205

NIST আট বছরের উন্মুক্ত প্রতিযোগিতার পর ১৩ আগস্ট ২০২৪ তারিখে তিনটি মান চূড়ান্ত করে।

মাননামকাজভিত্তিআকারের উদাহরণ
FIPS 203ML-KEMKey স্থাপন (KEM)Module latticeML-KEM-768: public key 1184 B, ciphertext 1088 B
FIPS 204ML-DSADigital signatureModule latticeML-DSA-65: public key 1952 B, signature 3309 B
FIPS 205SLH-DSADigital signatureHash (stateless)SLH-DSA-SHA2-128s: public key 32 B, signature 7856 B

তুলনার জন্য, X25519-এর public key মাত্র ৩২ byte আর Ed25519-এর signature ৬৪ byte. তাই সবচেয়ে বড় বাস্তব পরিবর্তন গণিতে নয়, আকারে। Handshake বড় হয়, certificate chain ভারী হয়, ছোট IoT যন্ত্রে জায়গা কমে। NIST ML-KEM-768-কে ডিফল্ট হিসেবে সুপারিশ করে। এছাড়া key স্থাপনের বিকল্প হিসেবে HQC মানের জন্য নির্বাচিত, আর FN-DSA (FIPS 206) খসড়া পর্যায়ে ছিল বলে জানা গেছে। এই দুটির অবস্থা ব্যবহারের আগে NIST-এর পাতায় দেখে নিন।

আজকের ঝুঁকি: আগে জমা, পরে খোলা

Harvest now, decrypt later মানে কেউ আজকের encrypted traffic জমা রাখছে, ভবিষ্যতে quantum computer এলে খুলবে বলে। মহল্লার পকেটমার আজই টাকা নেয়, কিন্তু এই চোর তালাবন্ধ সিন্দুকটিই তুলে নিয়ে যায়, পরে ভাঙবে বলে। ২০২৬ সালের শেষ পর্যন্ত এমন বড় quantum computer প্রকাশ্যে জানা নেই, আর কবে আসবে তা নিয়ে বিশেষজ্ঞদের মতভেদ আছে। তবু দীর্ঘদিন গোপন রাখার ডেটার জন্য ঝুঁকিটি আজকেরই, আর যা একবার জমা হয়ে গেছে তা আর ফেরানো যায় না।

Signature-এর হিসাব একটু আলাদা। আজকের signature আজ জাল হচ্ছে না, তাই “আগে জমা, পরে খোলা” এখানে সরাসরি খাটে না। কিন্তু দীর্ঘদিন বিশ্বাসযোগ্য থাকতে হয় এমন root key বা firmware key আগে বদলানো জরুরি, কারণ যন্ত্র একবার বিক্রি হলে তার ভেতরের বিশ্বাসের ভিত্তি বদলানো কঠিন।

Hybrid key exchange-এ একটি পুরোনো algorithm (যেমন X25519) আর একটি নতুন algorithm (ML-KEM) একসাথে চলে, আর দুটির ফল মিলিয়ে key বানানো হয়। একটি ভাঙলেও অন্যটি রক্ষা করে। আগস্ট ২০২৬-এ প্রকাশিত RFC 10024 TLS 1.3-এর জন্য এমন hybrid যেমন X25519MLKEM768 নির্দিষ্ট করেছে। এর client share ১২১৬ byte, যার ১১৮৪ byte ML-KEM আর ৩২ byte X25519.

NIST-এর সময়সূচি

NIST IR 8547-এর চূড়ান্ত রূপ অক্টোবর ২০২৬-এ প্রকাশ হয়েছে (নভেম্বর ২০২৪-এর খসড়ার পরে)। এটি মার্কিন federal ব্যবস্থার নথি, বাংলাদেশের কোনো প্রতিষ্ঠানের ওপর সরাসরি বাধ্যতামূলক নয়, তবে সারা বিশ্বের পণ্য ও মান এর সাথে তাল মেলায় বলে এটি একটি বাস্তব মাপকাঠি।

যা ঝুঁকিতে২০৩০-এর পর২০৩৫-এর পর
RSA, ECDSA, EdDSA signatureDeprecatedDisallowed
Finite field ও elliptic curve DH/MQV, RSA key স্থাপনDeprecatedDisallowed
মার্কিন federal-এর উচ্চ-মূল্যের systemKey স্থাপন ৩১ ডিসেম্বর ২০৩০-এর মধ্যে, signature ৩১ ডিসেম্বর ২০৩১-এর মধ্যে (EO 14412, OMB M-26-15)

এখানে deprecated মানে ব্যবহার করা যায়, তবে ঝুঁকি মেপে সিদ্ধান্ত নিতে হয়। Disallowed মানে সেই কাজে আর অনুমোদিত নয়। IR 8547 আরও বলে, ব্যবহারভিত্তিক নির্দেশনা হয়তো key স্থাপনে এর আগেই migration চাইবে। আর SHA-1 FIPS-validated module-এ ২০৩০-এর পর নিষিদ্ধ হবে। এই তারিখগুলো ভবিষ্যতে বদলাতে পারে, তাই পরিকল্পনার সময় মূল নথি দেখুন।

আরও গভীরে: ML-KEM আর ML-DSA Module-LWE ধরনের সমস্যার ওপর দাঁড়িয়ে, যেখানে ছোট noise মেশানো সমীকরণ সমাধান করা কঠিন বলে মনে করা হয়। SLH-DSA শুধু hash function-এর নিরাপত্তার ওপর নির্ভর করে, তাই ধীর ও বড় হলেও একে রক্ষণশীল বিকল্প ধরা হয়। KEM আর Diffie-Hellman এক জিনিস নয়: KEM-এ একপক্ষ একটি গোপন মান তৈরি করে অন্যের public key দিয়ে পাঠায়, তাই পুরোনো কোড সরাসরি বসানো যায় না। Hybrid-এর key combine করার নির্দেশনা আছে NIST SP 800-227 আর SP 800-56C-তে।

৯ · একটি প্রতিষ্ঠানের post-quantum পরিকল্পনা

Michele Mosca-র একটি সহজ অসমতা (Mosca-র হিসাব, ২০১৫) পরিকল্পনাকে সংখ্যায় আনে। x = ডেটা কত বছর নিরাপদ থাকতে হবে, y = migration-এ কত বছর লাগবে, z = বড় quantum computer আসতে কত বছর।

x + y > z হলে আপনি দেরি করে ফেলেছেন
দেরির পরিমাণ = x + y − z

উদাহরণ: ধরুন x = ১০, y = ৫, আর z = ১২ (ধরে নেওয়া সংখ্যা)। তাহলে x + y = ১৫, যা ১২-র চেয়ে বড়। অর্থাৎ ১৫ − ১২ = ৩ বছরের ডেটা ঝুঁকিতে থাকবে। z অনিশ্চিত, কিন্তু x আর y আপনার নিজের জানা সংখ্যা, আর সেখানেই আপনার হাত আছে।

এবার একটি কাল্পনিক ক্ষুদ্রঋণ প্রতিষ্ঠানের পাঁচটি system সাজাই। z = ১৫ একটি অনুমান মাত্র। মান বদলে আবার চালিয়ে দেখুন, ক্রম কতটা বদলায়।

// Mosca-র হিসাব: x = data কত বছর গোপন বা বিশ্বাসযোগ্য থাকতে হবে, y = migration-এর সময়।
// z = বড় quantum computer আসতে কত বছর: এটি ধরে নেওয়া সংখ্যা, কোনো পূর্বাভাস নয়।
const z = 15;
const systems = [
  { name: 'loan archive',    use: 'RSA key wrap', x: 25, y: 5 },
  { name: 'branch VPN',      use: 'ECDH',         x: 10, y: 3 },
  { name: 'website TLS',     use: 'ECDHE',        x: 2,  y: 1 },
  { name: 'firmware signing', use: 'ECDSA',       x: 15, y: 6 },
  { name: 'OTP codes',       use: 'HMAC only',    x: 0,  y: 0, symmetric: true },
];
const rows = systems
  .map(s => ({ ...s, gap: s.x + s.y - z }))
  .sort((a, b) => b.gap - a.gap);

console.log(`assumed z = ${z} years`);
for (const s of rows) {
  const verdict = s.symmetric ? 'no change needed'
    : s.gap > 0 ? `LATE by ${s.gap} years, start now`
    : `margin ${-s.gap} years, plan it`;
  console.log(`${s.name} (${s.use}): x+y=${s.x + s.y} -> ${verdict}`);
}

আসল আউটপুট:

assumed z = 15 years
loan archive (RSA key wrap): x+y=30 -> LATE by 15 years, start now
firmware signing (ECDSA): x+y=21 -> LATE by 6 years, start now
branch VPN (ECDH): x+y=13 -> margin 2 years, plan it
website TLS (ECDHE): x+y=3 -> margin 12 years, plan it
OTP codes (HMAC only): x+y=0 -> no change needed

আর্কাইভ সবার ওপরে, কারণ ঋণের নথি ২৫ বছর গোপন রাখতে হয়। Website TLS দেখতে সবচেয়ে “দৃশ্যমান” হলেও ঝুঁকিতে নিচের দিকে, অথচ সেটি সবচেয়ে সহজে বদলায়। শুধু HMAC-নির্ভর OTP বদলানোর দরকারই নেই। মনে রাখবেন, এটি অগ্রাধিকার সাজানোর হাতিয়ার, ভবিষ্যদ্বাণী নয়।

পাঁচটি system-এর অবস্থা (কাল্পনিক)
Loan archive
Firmware signing
Branch VPN
Website TLS
OTP codes
  1. তালিকা। দল পাঁচটি system-এর algorithm, মালিক আর ডেটার মেয়াদ লিখল। আর্কাইভের ডেটা AES-256 হলেও তার DEK RSA দিয়ে মোড়ানো, অর্থাৎ দুর্বল জায়গাটি মোড়কে, ডেটায় নয়। তালিকা ছাড়া এই তথ্য জানাই যেত না।
  2. Mosca-র হিসাব। z = ১৫ ধরে আর্কাইভ ১৫ বছর আর firmware ৬ বছর দেরিতে; VPN-এর হাতে ২ বছর, website-এর ১২ বছর। OTP শুধু HMAC-নির্ভর, তাই তালিকার বাইরে।
  3. Agility আগে। নতুন algorithm বসানোর আগে সব crypto কল একটি wrapper বা config-এ আনা হলো। এই কাজে নিরাপত্তা সরাসরি বাড়ে না, কিন্তু পরের সব ধাপ সহজ হয়।
  4. সহজটি দিয়ে অভিজ্ঞতা। Website-এ hybrid TLS চালু হলো, আর VPN-এ পরীক্ষা শুরু। আকার বড় হওয়ায় কোন পুরোনো firewall বা client সমস্যা করে, তা এখানেই শেখা হলো। ঝুঁকি কম, শিক্ষা বেশি।
  5. সবচেয়ে জরুরি ডেটা। আর্কাইভের DEK নতুন পদ্ধতিতে re-wrap হলো, ৬ নম্বর অংশের মতোই data না ছুঁয়ে। তবে আগে কেউ wrapped কপি জমা করে থাকলে সেই ঝুঁকি মোছে না। সেজন্য খুব সংবেদনশীল ডেটায় নতুন DEK-এ re-encrypt বিবেচনা করা হয়েছে।
  6. দীর্ঘজীবী বিশ্বাস। নতুন যন্ত্রে ML-DSA বা SLH-DSA-ভিত্তিক নতুন root যুক্ত হলো, আর VPN-এ hybrid চালু হলো। পুরোনো যন্ত্র কবে বাতিল হবে, সেই তারিখও নথিতে উঠল।
  7. পুরোনো পথ বন্ধ আর নজরদারি। সব system নতুন পথে চলছে, আর পুরোনো algorithm শুধু আগের ডেটা পড়ার জন্য রাখা। Log-এ পুরোনো algorithm-এর ব্যবহার দেখলে alert. তালিকাটি প্রতি বছর আবার দেখা হবে। OTP আগের মতোই আছে।

পরীক্ষা ও ইন্টারভিউতে:

  • ECB কেন খারাপ? একই plaintext block একই ciphertext দেয়, তাই নকশা ফাঁস হয়।
  • DEK আর KEK-এর পার্থক্য? DEK data encrypt করে, KEK DEK-কে মোড়ায়। KEK বদলালে data বদলাতে হয় না।
  • Secret তুলনায় == কেন নয়? প্রথম অমিলে থামে বলে সময় থেকে তথ্য ফাঁস হতে পারে। Constant-time function ব্যবহার করুন।
  • Quantum-এ AES-এর কী হবে? Grover আংশিক সুবিধা দেয়, Shor প্রযোজ্য নয়। AES ভাঙে না; RSA আর ECC ভাঙে।
  • ML-KEM, ML-DSA, SLH-DSA কোনটি কীসের? FIPS 203 key স্থাপন, FIPS 204 lattice signature, FIPS 205 hash-ভিত্তিক signature.

১০ · AI-এর যুগে crypto কোড

Crypto-তে AI-এর ঝুঁকি বিশেষভাবে বেশি, কারণ ভুল কোডও চলে আর test পাস করে। AI যে কোড দেয়, সেটি প্রায়ই পুরোনো টিউটোরিয়ালের প্রতিধ্বনি।

AI যা প্রায়ই করেকীভাবে ধরবেন
MD5, ECB বা salt ছাড়া hash দেয়ওপরের দশটি ভুলের তালিকা ধরে review
Certificate error দেখলে verify=False বলেError-এর কারণ খুঁজুন; যাচাই বন্ধ কোনো সমাধান নয়
Nonce একটি ধ্রুবক হিসেবে বসায়প্রতি message-এ নতুন nonce কোথায় তৈরি হচ্ছে, লাইন ধরে দেখুন
উদাহরণে key কোডে লিখে দেয়Key কোথা থেকে আসে তা জিজ্ঞেস করুন; secret scanner চালান
NIST-এর নথি বা CVE নম্বর বানিয়ে বলেমূল ওয়েবসাইটে নম্বরটি খুলে দেখুন
Post-quantum নিয়ে পুরোনো তারিখ বা নাম বলে (যেমন Kyber)FIPS আর NIST IR-এর বর্তমান রূপ দেখুন

AI-কে কোড লিখতে না বলে আগে review করতে বলুন। আসল key বা secret কখনো prompt-এ দেবেন না, নকল মান বসান।

তুমি একজন সতর্ক application security reviewer. নিচের কোডটি আমার নিজের প্রজেক্টের। এতে কোনো আসল key নেই। [এখানে কোড পেস্ট করুন, secret সরিয়ে] ১. এই দশটি ভুল এক এক করে খোঁজো: ECB, nonce পুনরাবৃত্তি, tag ছাড়া encryption, non-CSPRNG key, কোডে key, MD5/SHA-1, secret-এ ==, certificate যাচাই বন্ধ, tag-এর আগে decrypt, downgrade option. ২. প্রতিটি সমস্যায় লাইন নম্বর আর নিরাপদ সমাধান দাও। ৩. যে দাবি নিশ্চিত নও, সেটি "অনিশ্চিত" লেখো। কোনো CVE বা standard-এর নম্বর দিলে মূল উৎসের নাম বলো। ৪. কোনো attack-এর ধাপ দিও না, শুধু প্রতিরক্ষা বলো।

AI-এর crypto কোড গ্রহণের আগে

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।

প্র ০১২০০৮ সালে Debian-এর OpenSSL ঘটনায় algorithm ঠিক থাকার পরেও অসংখ্য key কেন বাতিল করতে হলো?

২০০৬ সালে Debian-এর OpenSSL package-এ একটি পরিবর্তন আসে। একটি কোড-যাচাই টুল randomness-এর উৎসের কাছে একটি সতর্কবার্তা দিচ্ছিল, আর সেটি দূর করতে কোড বদলানো হয়। উদ্দেশ্য ভালো ছিল। কিন্তু এর ফলে random সংখ্যার উৎসের বেশিরভাগ বৈচিত্র্য হারিয়ে যায়। মে ২০০৮-এ বিষয়টি প্রকাশ পায় (CVE-2008-0166). প্রায় দুই বছর ধরে Debian আর Ubuntu জাতীয় সিস্টেমে তৈরি SSH আর TLS key-গুলো খুব ছোট একটি সেট থেকে আসছিল।

লক্ষ্য করুন, RSA ভাঙেনি। ভেঙেছিল তার নিচের ভিত্তি। সব test পাস করছিল, key দেখতে স্বাভাবিক ছিল, সব কিছুই চলছিল। কোনো error-ও আসেনি।

সমাধান শুধু package আপডেট ছিল না। ওই সময়ে তৈরি প্রতিটি key নতুন করে বানাতে হয়, certificate পুনরায় ইস্যু করতে হয়, আর যাচাই করতে হয় কোন key কোথায় আছে। যাঁদের key-এর তালিকা ছিল না, তাঁদের জন্য কাজটি ছিল অত্যন্ত কঠিন। এখান থেকেই key inventory-র মূল্য বোঝা যায়।

আরও তিনটি শিক্ষা আছে। প্রথমত, upstream-এর crypto কোডে স্থানীয় পরিবর্তন খুব বিপজ্জনক। দ্বিতীয়ত, টুলের সতর্কবার্তা চুপ করানোর আগে কারণ বুঝতে হয়, যা আজ AI-এর পরামর্শেও সমানভাবে প্রযোজ্য। তৃতীয়ত, randomness-এর মান সাধারণ test দিয়ে ধরা পড়ে না, তাই ভালো উৎস ব্যবহার আর স্বাধীন review-ই ভরসা।

আজকের দিনেও একই ধরনের ঝুঁকি আছে। ছোট IoT যন্ত্র বা নতুন চালু হওয়া virtual machine অনেক সময় একেবারে শুরুতেই key বানায়, যখন randomness-এর উৎস তখনও যথেষ্ট তৈরি থাকে না। তাই OS-এর দেওয়া CSPRNG ব্যবহার করা, আর একই ছাঁচের অনেক যন্ত্রে key পুনরাবৃত্তি হচ্ছে কি না নিজের fleet-এ যাচাই করা জরুরি।

মূল উপলব্ধি: শক্ত algorithm দুর্বল randomness-কে বাঁচাতে পারে না। আর ভালো key management মানে শুধু key রাখা নয়, দরকারে সব key দ্রুত খুঁজে বদলাতে পারাও।

প্র ০২SHA-1 দুর্বল বলে জানা গিয়েছিল ২০০৫ সালে। তাহলে বিদায়ে দুই দশকের বেশি লাগছে কেন?

২০০৫ সালে Xiaoyun Wang ও সহকর্মীরা দেখান, SHA-1-এর collision প্রত্যাশার চেয়ে অনেক কম কাজে সম্ভব। তখন সেটি ছিল শুধু তাত্ত্বিক ফল। ২০১৭ সালে Google আর CWI Amsterdam-এর গবেষকরা প্রথম প্রকাশ্য SHA-1 collision দেখান, যার নাম SHAttered. ২০২০ সালে Gaëtan Leurent আর Thomas Peyrin chosen-prefix collision প্রকাশ করেন, যা আরও বাস্তব ঝুঁকির দিকে নির্দেশ করে। NIST ডিসেম্বর ২০২২-এ ঘোষণা দেয়, SHA-1 ধীরে ধীরে সরিয়ে ফেলা হবে, আর IR 8547 অনুযায়ী FIPS-validated module-এ এটি ২০৩০-এর পর নিষিদ্ধ।

MD5-এর গল্পও একই রকম। ২০১২ সালে Flame malware-এর বিশ্লেষণে দেখা যায়, MD5 collision ব্যবহার করে জাল code-signing certificate বানানো হয়েছিল, অথচ MD5-এর দুর্বলতা তার বহু বছর আগেই জানা ছিল। অর্থাৎ পরিচিত দুর্বলতা আসল ক্ষতিতে রূপ নিতে সময় নেয়, কিন্তু ক্ষতি হয়ই।

দেরির কারণ প্রযুক্তিগত নয়, ব্যবস্থাগত। Hash শুধু এক জায়গায় থাকে না: certificate, signature, পুরোনো যন্ত্র, firmware, file format, database-এর দীর্ঘস্থায়ী রেকর্ড, সবখানেই থাকে। এক পক্ষ বদলালেই হয় না, অপর পক্ষকেও বুঝতে হয়। পুরোনো যন্ত্রের নির্মাতা হয়তো আর নেই।

এই ইতিহাস post-quantum-এর জন্য সরাসরি সতর্কবার্তা। RSA আর ECC SHA-1-এর চেয়েও অনেক গভীরে ঢোকানো, আর এবার বদলের আকারও বড়।

একটি দল আজ যা করতে পারে: নতুন নকশায় পুরোনো hash ঢুকতে না দেওয়া, কোথায় কোথায় ব্যবহার হচ্ছে তার তালিকা রাখা, প্রতিটি ব্যবহারের একজন মালিক ঠিক করা, আর বিদায়ের একটি শেষ তারিখ ঘোষণা করে সেটি মেনে চলা।

মূল উপলব্ধি: Crypto migration সাধারণত এক দশকের বেশি সময় নেয়। ভাঙার খবর পেয়ে শুরু করলে দেরি হয়ে যায়। তাই agility আর inventory আগে থেকেই বানাতে হয়।

প্র ০৩পুরোনো সিস্টেমের সাথে compatibility রাখা ভালো, নাকি সেটিই downgrade-এর দরজা? Agility আর নিরাপত্তার এই টানাপোড়েন কীভাবে মেটে?

১৯৯০-এর দশকে মার্কিন রপ্তানি নিয়মের কারণে দুর্বল “export-grade” crypto তৈরি হয়। নিয়ম পরে শিথিল হয়, কিন্তু কোড থেকে সেই option মুছে যায়নি। প্রায় দুই দশক পরে ২০১৫ সালে FREAK আর Logjam প্রকাশ পায়: গবেষকরা দেখান, এই পুরোনো option-গুলো খোলা থাকলে আধুনিক ক্লায়েন্ট-সার্ভারের সংযোগও দুর্বল পথে নামতে পারে। ২০১৪ সালের POODLE দেখিয়েছিল, পুরোনো SSL 3.0-এ ফিরে যাওয়ার সুবিধা নিজেই ঝুঁকি।

এগুলো কোনো নতুন গণিত নয়। সমস্যাটি ছিল “সবার সাথে কাজ করব” নীতি। দর-কষাকষির প্রতিটি অতিরিক্ত option আক্রমণের জায়গা বাড়ায়, আর দুর্বলতম সমর্থিত option-ই আসল সুরক্ষার মাত্রা ঠিক করতে পারে।

TLS 1.3 (প্রথম RFC 8446, ২০১৮; এখন RFC 9846) তাই পথ বদলায়। RSA key transport, CBC, পুরোনো hash সব সরিয়ে দেয়, handshake-এর বড় অংশ encrypted করে, আর downgrade ধরার জন্য বিশেষ চিহ্ন যোগ করে। WireGuard আরও কঠোর: কোনো দর-কষাকষিই নেই, একটি নির্দিষ্ট suite. সমস্যা হলে পুরো protocol-এর নতুন version.

এখানে মতভেদ আছে। Adam Langley-এর মতো লেখকরা ২০১৬ সালে agility-র দাম নিয়ে সতর্ক করেন: option যত কম, ভুলও তত কম। আবার post-quantum দেখাচ্ছে, algorithm বদলানোর ক্ষমতা অবশ্যই থাকতে হবে। সমাধান দুটিকে আলাদা করা: সিস্টেম বদলাতে পারবে, কিন্তু যেকোনো সময়ে অল্প কয়েকটি শক্ত বিকল্পই চালু থাকবে।

বাস্তবে একটি দল যা করতে পারে: নিজের server-এ চালু version আর cipher-এর তালিকা নিয়মিত দেখা, পুরোনো client-এর ব্যবহার মেপে বন্ধের তারিখ ঘোষণা করা, আর সেই তারিখে সত্যিই বন্ধ করা। ছোট সংখ্যক পুরোনো client-এর জন্য সবার ঝুঁকি বাড়ানো সাধারণত ভালো সিদ্ধান্ত নয়।

মূল উপলব্ধি: Agility মানে অনেক দরজা খোলা রাখা নয়, দরজা বদলানোর সামর্থ্য রাখা। নতুনটি খোলার পর পুরোনোটি সত্যিই বন্ধ করতে হবে।

প্র ০৪একটি মাত্র signing key হাতছাড়া হলে কত বড় ক্ষতি হতে পারে? ২০২৩ সালের ঘটনার প্রকাশিত পর্যালোচনা থেকে কী শেখার আছে?

US Cyber Safety Review Board ২০২৪ সালে Microsoft Exchange Online-এর ২০২৩ সালের অনুপ্রবেশ নিয়ে একটি পর্যালোচনা প্রকাশ করে। সরকারি প্রকাশনা অনুযায়ী, একটি হামলাকারী দল একটি signing key হাতে পেয়ে authentication token জাল করতে পারে, আর আরেকটি ত্রুটির সাথে মিলে এটি বিভিন্ন প্রতিষ্ঠানের mailbox-এ প্রবেশের সুযোগ দেয়। Key-টি ঠিক কীভাবে হাতছাড়া হয়েছিল, তা নিয়ে পর্যালোচনায় নিশ্চিত প্রমাণ মেলেনি। Board একে প্রতিরোধযোগ্য বলে উল্লেখ করে। আমরা এখানে হামলার পথ নয়, প্রতিরক্ষার শিক্ষা দেখব।

প্রথম শিক্ষা blast radius. একটি signing key যত বড় পরিধিতে বিশ্বাসযোগ্য, তার ফাঁসের ক্ষতিও তত বড়। তাই আলাদা উদ্দেশ্য, আলাদা ব্যবহারকারী শ্রেণি আর আলাদা পরিবেশের জন্য আলাদা key থাকা উচিত। যাচাইকারী পক্ষকেও token-এর scope আর issuer সতর্কভাবে মিলিয়ে দেখতে হয়।

দ্বিতীয় শিক্ষা key-এর অবস্থান। Signing key যত সম্ভব HSM-এর মতো জায়গায় রাখা উচিত, যাতে তা কোনো process-এর memory, log বা debug ফাইলে আসার সুযোগই না পায়।

তৃতীয় শিক্ষা rotation আর automation. হাতে করা rotation ঝুঁকিপূর্ণ বলে দলগুলো অনেক সময় তা এড়িয়ে যায়। Automated rotation থাকলে key-এর বয়স কম থাকে, আর জরুরি অবস্থায় বদলানোর পথটিও আগে থেকেই পরীক্ষিত থাকে।

চতুর্থ শিক্ষা detection. সেবার ব্যবহার-log অনেকের কাছেই সহজলভ্য না থাকা নিয়ে তখন প্রশ্ন ওঠে। পর্যাপ্ত log ছাড়া অস্বাভাবিক key ব্যবহার ধরা যায় না।

মূল উপলব্ধি: ধরে নিন key একদিন ফাঁস হতে পারে। প্রশ্ন হলো, তখন ক্ষতির সীমা কতটুকু, আর আপনি কত দ্রুত জানবেন ও বদলাবেন।

প্র ০৫নতুন মান তো NIST যাচাই করেছে। তাহলে hybrid কেন? সরাসরি ML-KEM-এ গেলে সমস্যা কী?

দুটি ঘটনা উত্তরটি সহজ করে। NIST প্রতিযোগিতার শেষ দিকের প্রার্থী Rainbow ২০২২ সালের শুরুতে Ward Beullens-এর কাজে গুরুতরভাবে দুর্বল প্রমাণিত হয়। সে বছরই SIKE, যা তখনও বিবেচনায় ছিল, Wouter Castryck আর Thomas Decru-র গবেষণায় ভেঙে যায়, আর সেই হিসাব সাধারণ কম্পিউটারেই করা গিয়েছিল। অর্থাৎ বছরের পর বছর বিশেষজ্ঞদের যাচাই পেরিয়েও একটি নকশা হঠাৎ পড়ে যেতে পারে।

ML-KEM সেই দুটির চেয়ে অনেক বেশি পরীক্ষিত, আর lattice-এর ওপর বহু বছরের গবেষণা আছে। তবু RSA বা elliptic curve যত দশক ধরে আক্রমণ সহ্য করেছে, নতুন implementation তত সময় পায়নি। ২০২৩-২৪ সালে KyberSlash নামে প্রকাশিত সমস্যা দেখায়, কিছু library-তে secret-নির্ভর ভাগের কারণে সময়ের ফাঁস ছিল। গণিত ঠিক থাকলেও ৩ নম্বর অংশের সেই পুরোনো ভুল ফিরে আসে।

Hybrid দুটি বাজি একসাথে ধরে: ক্ল্যাসিক্যাল অংশ আজকের চেনা শত্রুর বিরুদ্ধে, নতুন অংশ ভবিষ্যতের quantum শত্রুর বিরুদ্ধে। দাম হলো বড় message আর বেশি জটিলতা।

এখানে সরকারি সংস্থাগুলোর অবস্থান এক নয়। প্রকাশিত নির্দেশনা অনুযায়ী ফ্রান্সের ANSSI আর জার্মানির BSI hybrid-এর পক্ষে জোর দিয়েছে, অন্যদিকে মার্কিন NSA-র CNSA 2.0 hybrid বাধ্যতামূলক করেনি এবং জটিলতার দিকটি তুলে ধরেছে। NIST IR 8547 hybrid-কে সাধারণত সাময়িক ব্যবস্থা হিসেবে দেখে, যার পরে আরেকটি migration লাগতে পারে। তাই নিজের নিয়ন্ত্রক ও পণ্যের নির্দেশনা দেখে সিদ্ধান্ত নিন।

মূল উপলব্ধি: অনিশ্চয়তা থাকলে একটি বিকল্পে সব ভরসা না রেখে স্তর রাখা বুদ্ধিমানের কাজ। এটি defense in depth-এরই crypto রূপ।

অনুশীলন

হিসাব, নকশা, ফল অনুমান আর নিজের কোডে যাচাই, চার রকম কাজ।

  1. হিসাব করুন: (ক) একটি সেবা একই AES-GCM key-তে এলোমেলো ৯৬-bit nonce দিয়ে 236টি message encrypt করেছে। Collision-এর আনুমানিক সম্ভাবনা কত? (খ) একটি সংস্থায় x = ৭, y = ৪, আর ধরে নেওয়া z = ১০। Mosca-র হিসাবে ফল কী? (গ) NIST-এর 232 সীমার সাথে (ক) কেমন?

    (ক) n² / 297 = 272 / 297 = 2−25, অর্থাৎ প্রায় ৩ × ১০−৮। সংখ্যাটি ছোট মনে হলেও নিয়মের ভেতরে থাকা নিরাপত্তার সীমা অনেক কড়া।

    (খ) x + y = ১১, যা ১০-এর চেয়ে বড়। তাই ১ বছর দেরি। এখনই শুরু করা দরকার, অথবা y কমানোর উপায় খুঁজতে হবে।

    (গ) 236 সংখ্যাটি 232-এর ১৬ গুণ, তাই সীমা পেরিয়ে গেছে। সমাধান হলো সীমার আগেই key বদলানো, অথবা নকশা করা counter-ভিত্তিক nonce ব্যবহার।

  2. নকশা করুন ও সমালোচনা করুন: একটি কাল্পনিক অনলাইন বাজার গ্রাহকের NID-এর ছবি রাখে। বর্তমান নকশা: সব ছবি একটি AES key দিয়ে encrypt, key থাকে config.py-তে, আর সেটি কখনো বদলানো হয়নি। সমস্যাগুলো বলুন, আর একটি ভালো নকশা দিন।

    সমস্যা: কোডে key থাকায় repository আর backup-এ ফাঁসের ঝুঁকি। এক key মানে সব ছবির একই blast radius. Rotation না থাকায় ফাঁস হলেও ক্ষতির সময় অসীম। কে কখন key ব্যবহার করল তার কোনো log নেই। Mode আর nonce-এর তথ্যও জানা নেই।

    ভালো নকশা: KMS-এ একটি KEK, যেখানে HSM ব্যবহারের বিকল্প বিবেচনা করা যায়। প্রতিটি ছবির জন্য নতুন DEK, AES-256-GCM, আর ছবির সাথে wrapped DEK ও version. Application-এর শুধু দরকারি permission. নিয়মিত automated rotation. Unwrap-এর অস্বাভাবিক সংখ্যায় alert. পুরোনো ছবিগুলো পর্যায়ক্রমে নতুন নকশায় আনা, কারণ আগের key কোডে ছিল। আর আগে ভাবুন, ছবিটি আদৌ রাখা দরকার কি না (পর্ব ৭০)।

  3. ফল অনুমান করুন: একটি খেলনা KMS-এ শুধু KEK v1 আছে। ধাপগুলো: record A v1-এ seal, v2 তৈরি করে active করা, record B seal, তারপর v1 ধ্বংস (A-কে re-wrap না করেই)। এরপর A আর B খুললে কী হবে? আগে অনুমান করুন, তারপর simulator বদলে দেখুন।

    A ব্যর্থ: KEK v1 destroyed, কারণ A-র DEK এখনো v1-এ মোড়ানো, আর v1 নেই। B সফল, কারণ B v2 দিয়ে মোড়ানো। শেষ অবস্থা: KMS-এ শুধু v2, A স্থায়ীভাবে অপাঠ্য। এই ভুল আটকানোর জন্যই rotation stepper-এর “সব record যাচাই” ধাপটি আছে, আর অনেক KMS ধ্বংসের আগে অপেক্ষার সময় রাখে।

  4. নিজের কোডে খুঁজুন: শুধু নিজের প্রজেক্টের ফোল্ডারে নিচের কমান্ডটি চালান। প্রতিটি ফলাফল সত্যিকারের সমস্যা কি না, উপরের তালিকা ধরে বিচার করুন।
    # উদাহরণ: শুধু নিজের কোডের ওপর, কিছু বদলায় না
    grep -rnE "verify=False|rejectUnauthorized: *false|MODE_ECB|md5\(|sha1\(" ./src

    কমান্ডটি শুধু পড়ে, কোনো ফাইল বদলায় না। ফলাফল মানেই bug নয়। ফাইলের checksum মেলাতে MD5 ব্যবহার নিরাপত্তার কাজ নাও হতে পারে, তবে password বা signature-এ MD5 গুরুতর। verify=False test কোডেও বিপজ্জনক, কারণ এমন কোড প্রায়ই production-এ চলে যায়। প্রতিটি ফলাফলে সিদ্ধান্ত নিয়ে কারণ লিখে রাখুন। আর মনে রাখবেন, এই খোঁজ শুধু লেখা মেলায়, nonce পুনরাবৃত্তির মতো যুক্তির ভুল ধরবে না। অন্যের code-এ চালাতে হলে লিখিত অনুমতি নিন।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমEnvelope encryption-এ একটি record পড়ার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. Storage থেকে encrypted data আর wrapped DEK আনা
  2. Wrapped DEK KMS-এ পাঠানো
  3. KMS-এর permission যাচাই আর log লেখা
  4. KMS থেকে খোলা DEK পাওয়া
  5. স্থানীয়ভাবে tag যাচাই করে decrypt করা
  6. কাজ শেষে memory থেকে DEK মুছে ফেলা

AES-GCM-এ একই key-তে একই nonce দিয়ে দুটি আলাদা message encrypt হলে কী ঘটে?

  • শুধু message-এর দৈর্ঘ্য ফাঁস হয়, আর কিছু নয়
  • গোপনীয়তা আর tag-এর নিরাপত্তা, দুটোই ক্ষতিগ্রস্ত হয়
  • Library সবসময় error দিয়ে থামিয়ে দেয়
  • AES-GCM স্বয়ংক্রিয়ভাবে key বদলে নেয়

Envelope encryption-এ KEK v1 থেকে v2-তে rotation করে সব DEK re-wrap করা হলো। Encrypted data-র কী হয়?

  • সব data নতুন করে encrypt হয়
  • পুরোনো data আর পড়া যায় না
  • Data অপরিবর্তিত থাকে, শুধু wrapped DEK বদলায়
  • Data KMS-এ পাঠিয়ে নতুন key-তে আনা হয়

Python-এ একটি API request-এর HMAC tag যাচাইয়ের সবচেয়ে ভালো উপায় কোনটি?

  • প্রত্যাশিত tag হিসাব করে hmac.compare_digest দিয়ে তুলনা
  • প্রত্যাশিত tag হিসাব করে == দিয়ে তুলনা
  • Tag-কে base64 decode করে দৈর্ঘ্য দেখা
  • নিজে লুপ লিখে byte মেলানো, আর অমিলে সাথে সাথে ফেরা

বড় quantum computer এলে RSA বদলাতে হবে, কিন্তু AES-256 নিয়ে তেমন চিন্তা নেই কেন?

  • AES-256 quantum computer-এ দ্রুত চলে
  • AES-256 নিজেই একটি quantum algorithm
  • Shor AES-ও ভাঙে, তবে অনেক দেরিতে
  • Shor RSA-র গঠন ভাঙে, আর AES-এ শুধু Grover-এর সীমিত সুবিধা খাটে

TLS handshake-এ key স্থাপনের জন্য কোন post-quantum মানটি তৈরি?

  • FIPS 204 ML-DSA
  • FIPS 203 ML-KEM
  • FIPS 205 SLH-DSA
  • FIPS 197 AES

একটি হাসপাতালের নথি ৩০ বছর গোপন রাখতে হবে, migration-এ লাগবে ৫ বছর, আর ধরে নেওয়া হলো বড় quantum computer ২০ বছরে আসবে। Mosca-র হিসাবে ফল কী?

  • ৫ বছর হাতে আছে
  • ১০ বছর দেরি
  • ১৫ বছর দেরি
  • কোনো ঝুঁকি নেই

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. নিজে বানাবেন না: যাচাই করা library-র উঁচু স্তরের API আর AEAD ব্যবহার করুন।
  2. দশটি ভুল চিনুন: ECB, nonce পুনরাবৃত্তি, tag ছাড়া encryption, দুর্বল random, কোডে key, MD5/SHA-1, ==, যাচাই বন্ধ, tag-এর আগে decrypt, downgrade.
  3. Secret তুলনা করুন constant-time function দিয়ে, আর সবসময় আগে যাচাই, পরে decrypt.
  4. Key-এর ছয় ধাপ: তৈরি, সংরক্ষণ, ব্যবহার, rotation, বাতিল, ধ্বংস। Envelope encryption-এ KEK বদলালে data ছুঁতে হয় না।
  5. Post-quantum: RSA ও ECC বদলাতে হবে, AES থাকবে। FIPS 203, 204, 205 এসে গেছে; x + y > z হলে এখনই শুরু করুন।

পরের পর্বে: Cryptography মডিউল এখানেই শেষ। এবার সেই হাতিয়ারগুলো মানুষের পরিচয় যাচাইয়ে কাজে লাগবে: Authentication, পরিচয় যাচাইয়ের উপায় আর password নীতি।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান