পাঠের ভিডিও দেখুন: ক্রিপ্টোগ্রাফিক রসিদ দিয়ে AI এজেন্ট সুরক্ষিত করা
(Microsoft কনটেন্ট টিম মিশ্রণের পর পাঠের ভিডিও এবং থাম্বনেইল যোগ করবে, যা পাঠ ১৪ / ১৫ এর প্যাটার্নের সাথে মিলে যাবে)
এই পাঠে আলোচনা করা হবে:
এই পাঠ শেষ করার পর, আপনি জানতে পারবেন কিভাবে:
ভাবুন, আপনি কন্টোসো ট্রাভেলের জন্য একটি AI এজেন্ট স্থাপন করেছেন। এজেন্ট গ্রাহকের অনুরোধ পড়ে, ফ্লাইট API কল করে বিকল্প খোঁজে, এবং গ্রাহকের পক্ষ থেকে আসন বুক করে। গত ত্রৈমাসিকে, এজেন্ট ৫০,০০০টি বুকিং প্রক্রিয়া করেছে।
আজ একজন অডিটর উপস্থিত হয়। তারা একটি সরল প্রশ্ন করে: “আপনার এজেন্ট কী করেছে তা দেখান।”
আপনি আপনার লগ ফাইল হস্তান্তর করেন। অডিটর ফাইলগুলো দেখে কঠিন প্রশ্ন করে: “আমি কীভাবে নিশ্চিত হব যে এই লগগুলো সম্পাদিত হয়নি?”
এই হল অডিট-ট্রেইল সমস্যা। আজকের দিনটিতে অধিকাংশ এজেন্ট স্থাপন নির্ভরশীল:
এগুলোর কোনোটাই অডিটরের প্রশ্নের উত্তর দিতে পারে না বশর্তে যে অডিটর কাউকে বিশ্বাস করতে হবে (আপনি, আপনার ক্লাউড প্রোভাইডার, বা ডাটাবেস বিক্রেতা)। অভ্যন্তরীণ ব্যবহারের জন্য, এই বিশ্বাস প্রায়শই গ্রহণযোগ্য। নিয়ন্ত্রিত কাজের জন্য (অর্থনীতি, স্বাস্থ্যসেবা, EU AI আইন প্রযোজ্য ক্ষেত্র), তা গ্রহণযোগ্য নয়।
ক্রিপ্টোগ্রাফিক রসিদগুলো এনেছে এমন ব্যবস্থা যা প্রতিটি এজেন্ট ক্রিয়াকলাপকে স্বতন্ত্রভাবে যাচাইযোগ্য করে তোলে। অডিটর আপনাকে বিশ্বাস করতে হবে না। ওদের কেবল আপনার পাবলিক কী এবং রসিদটাই দরকার।
রসিদ হল একটি JSON অবজেক্ট যা নির্দেশ করে এজেন্ট কী করেছে, ডিজিটাল স্বাক্ষর দিয়ে সই করা।
flowchart LR
A[এজেন্ট একটি টুল সক্রিয় করে] --> B[রসিদ পে-লোড তৈরি করুন]
B --> C[JSON RFC 8785 কে ক্যানোনিক্যালাইজ করুন]
C --> D[SHA-256 হ্যাশ]
D --> E[Ed25519 স্বাক্ষর]
E --> F[স্বাক্ষর সহ রসিদ]
F --> G[অডিটর অফলাইন যাচাই করে]
G --> H{স্বাক্ষর বৈধ?}
H -- yes --> I[তামপার-প্রমাণ প্রমাণ]
H -- no --> J[রসিদ গ্রহণ করা হয়নি]
একটি ন্যূনতম রসিদ এরকম দেখায়:
{
"type": "agent.tool_call.v1",
"agent_id": "contoso-travel-bot",
"tool_name": "lookup_flights",
"tool_args_hash": "sha256:a3f9c1...",
"result_hash": "sha256:7b2e1d...",
"policy_id": "contoso-travel-policy-v3",
"timestamp": "2026-04-25T14:30:00Z",
"sequence": 47,
"previous_receipt_hash": "sha256:9d4e6a...",
"signature": {
"alg": "EdDSA",
"sig": "c5af83...",
"public_key": "8f3b2c..."
}
}
তিনটি বৈশিষ্ট্য কাজ করছে:
স্বাক্ষর। রসিদটি এজেন্টের গেটওয়ে দ্বারা Ed25519 প্রাইভেট কী ব্যবহার করে সই করা হয়েছে। সংশ্লিষ্ট পাবলিক কী থাকা যেকেউ স্বাক্ষর অফলাইনে যাচাই করতে পারে। যেকোনো ক্ষেত্র পরিবর্তনে স্বাক্ষর অবৈধ হয়ে যায়।
ক্যানোনিকাল এনকোডিং। সই করার আগে, রসিদ JSON Canonicalization Scheme (JCS, RFC 8785) ব্যবহার করে সিরিয়ালাইজ করা হয়। এটি নিশ্চিত করে একটি যৌক্তিকভাবে সমান রসিদ উৎপাদনকারী দুইটি ইমপ্লিমেন্টেশন একই বাইট-পরিচিত আউটপুট তৈরি করে। ক্যানোনিকালাইজেশন ছাড়া বিভিন্ন JSON সিরিয়ালাইজার একই কন্টেন্টের জন্য ভিন্ন স্বাক্ষর তৈরি করবে।
হ্যাশ চেইনিং। previous_receipt_hash ক্ষেত্রটি প্রতিটি রসিদকে তার পূর্ববর্তী রসিদের সাথে যুক্ত করে। একটি রসিদ সরানো বা পুনঃক্রমবিন্যাস করলে তার পরবর্তী প্রতিটি রসিদের চেইন ভেঙে যায়। ট্যাম্পারিং চেইন স্তরে দৃশ্যমান হয় যদিও পৃথক স্বাক্ষর বাইপাস হয়।
এই গুণাবলীগুলো একত্রে তিনটি নিশ্চয়তা প্রদান করে:
রসিদ তৈরি করতে আপনার বিশেষ কোনো লাইব্রেরি দরকার নেই। ক্রিপ্টোগ্রাফিক প্রিমিটিভগুলো ব্যাপকভাবে উপলব্ধ এবং লজিকের মাত্র কয়েক ডজন লাইন পাইথন কোড।
code_samples/18-signed-receipts.ipynb এর হ্যান্ডস-অন অনুশীলনগুলো পুরো প্রক্রিয়া ব্যাখ্যা করে। সারাংশ:
import json
import hashlib
import base64
from nacl import signing
from jcs import canonicalize # RFC 8785 ক্যানোনিক্যাল JSON
def b64url_nopad(data: bytes) -> str:
return base64.urlsafe_b64encode(data).decode("ascii").rstrip("=")
def sha256_canonical(obj) -> str:
"""SHA-256 of a Python object's JCS-canonical JSON form."""
return f"sha256:{hashlib.sha256(canonicalize(obj)).hexdigest()}"
# একটি সাইনিং কী তৈরি অথবা লোড করুন (প্রোডাকশনে, কী ভল্টে সংরক্ষণ করুন)
signing_key = signing.SigningKey.generate()
verify_key = signing_key.verify_key
# রিসিপ্ট পে-লোড তৈরি করুন (এখনো সিগনেচার নেই)
tool_args = {"origin": "SYD", "destination": "LAX"}
tool_result = [{"flight": "QF11", "price": 1850, "stops": 0}]
payload = {
"type": "agent.tool_call.v1",
"agent_id": "contoso-travel-bot",
"tool_name": "lookup_flights",
"tool_args_hash": sha256_canonical(tool_args),
"result_hash": sha256_canonical(tool_result),
"policy_id": "contoso-travel-policy-v3",
"timestamp": "2026-04-25T14:30:00Z",
"sequence": 0,
"previous_receipt_hash": None,
}
# ক্যানোনিক্যালাইজ করুন, হ্যাশ করুন, সাইন করুন।
canonical_bytes = canonicalize(payload)
message_hash = hashlib.sha256(canonical_bytes).digest()
signature_bytes = signing_key.sign(message_hash).signature
# একটি স্ট্রাকচার্ড সিগনেচার অবজেক্ট সংযুক্ত করুন।
receipt = {
**payload,
"signature": {
"alg": "EdDSA",
"sig": b64url_nopad(signature_bytes),
"public_key": b64url_nopad(bytes(verify_key)),
},
}
এটাই সম্পূর্ণ সাইনিং পাইপলাইন। নোটবুকের অনুশীলনগুলো প্রতিটি ধাপে আপনাকে পথ দেখাবে।
যাচাই প্রত্যাবর্তনীয় অপারেশন:
import base64
import hashlib
from nacl import signing
from nacl.exceptions import BadSignatureError
from jcs import canonicalize
def b64url_decode(s: str) -> bytes:
padding = "=" * ((4 - len(s) % 4) % 4)
return base64.urlsafe_b64decode(s + padding)
def verify_receipt(receipt: dict) -> bool:
# স্বাক্ষর একটি গঠিত অবজেক্ট: {"alg", "sig", "public_key"}.
sig_obj = receipt.get("signature")
if not sig_obj or sig_obj.get("alg") != "EdDSA":
return False
# আসলে যা স্বাক্ষরিত হয়েছে সেই পে-লোডটি পুনর্গঠন করুন (স্বাক্ষর ছাড়া সবকিছু).
payload = {k: v for k, v in receipt.items() if k != "signature"}
canonical_bytes = canonicalize(payload)
message_hash = hashlib.sha256(canonical_bytes).digest()
try:
verify_key = signing.VerifyKey(b64url_decode(sig_obj["public_key"]))
verify_key.verify(message_hash, b64url_decode(sig_obj["sig"]))
return True
except BadSignatureError:
return False
এই ফাংশন একটি রসিদ নেয় এবং সোচ্চার True রিটার্ন করে যদি স্বাক্ষর বৈধ হয়, অন্যথায় False। কোন নেটওয়ার্ক কল, কোন সেবা নির্ভরতা বা তৃতীয় পক্ষের প্রতি বিশ্বাসের প্রয়োজন নেই।
ট্যাম্পারিং সনাক্তকরণের জন্য, নোটবুকটি দেখায়:
tool_args_hash ক্ষেত্রের এক বাইট পরিবর্তন।এটি বাস্তব প্রদর্শনী যে রসিদগুলো ট্যাম্পার-এভিডেন্ট: যেকোনো পরিবর্তন, যত ছোটই হোক, স্বাক্ষর ভেঙে দেয়।
একটি স্বাক্ষরিত রসিদ একটি ক্রিয়া রক্ষা করে। রসিদগুলোর চেইন একটি সিকোয়েন্স রক্ষা করে।
flowchart LR
R0[রিসিপ্ট 0<br/>জেনেসিস] --> R1[রিসিপ্ট 1]
R1 --> R2[রিসিপ্ট 2]
R2 --> R3[রিসিপ্ট 3]
R1 -. previous_receipt_hash .-> R0
R2 -. previous_receipt_hash .-> R1
R3 -. previous_receipt_hash .-> R2
প্রত্যেক রসিদ তার পূর্ববর্তী রসিদের হ্যাশ রেকর্ড করে। চেন থেকে রসিদ ২ নিশ্চুপে সরাতে একটি আক্রমণকারীকে করতে হবে:
previous_receipt_hash ক্ষেত্র পরিবর্তন করা (রসিদ ৩ এর স্বাক্ষর ভেঙে যাবে), অথবাযদি প্রাইভেট কী হার্ডওয়্যার কী ভল্টে থাকে এবং আপনি প্রতিটি রসিদের সাথে পাবলিক কী প্রকাশ করেন, তবে কোনো ধরনের আক্রমণ সুস্পষ্ট ছাড়া সম্ভব নয়।
নোটবুক দেখায়:
previous_receipt_hash পূর্ববর্তী রসিদের আসল হ্যাশের সাথে মেলানো যাচাই।এইভাবে আপনি একটি অডিট ট্রেইল তৈরি করেন যা বাহ্যিক অডিটর আপনাকে বিশ্বাস না করেও যাচাই করতে পারে।
এই পাঠের সবচেয়ে গুরুত্বপূর্ণ অংশ। রসিদ শক্তিশালী, কিন্তু সেই শক্তি সীমানাবদ্ধ।
রসিদ তিনটি বিষয় প্রমাণ করে:
রসিদ প্রমাণ করে না:
policy_id তে উল্লেখিত নীতি বাস্তবায়িত হয়েছে কিনা বা নীতি চেক করে এই কাজ অনুমোদিত হতো কিনা রসিদ জানায় না। রসিদ শুধুমাত্র দাবি করে কী হয়েছে, বাস্তবায়িত কী হয়নি।এই সীমানা দুটি কারণে গুরুত্বপূর্ণ:
একটি সাধারণ ভুল ধারণা হলো “আমাদের রসিদ আছে” মানে “আমরা শাসিত”। তা নয়। রসিদ হলো ভিত্তি। শাসন ব্যবস্থা আপনার তৈরি করা সিস্টেম।
এই পাঠের পাইথন কোড ইচ্ছাকৃতভাবে ন্যূনতম যাতে আপনি প্রতিটি লাইন পড়ে সম্পূর্ণ বুঝতে পারেন। প্রোডাকশনে আপনার দুটি বিকল্প আছে:
ক্রিপ্টোগ্রাফিক প্রিমিটিভগুলো সরাসরি ব্যবহার করুন। উপরোক্ত ৫০ লাইন অনেক ব্যবহারের জন্য যথেষ্ট। PyNaCl (Ed25519) এবং jcs প্যাকেজ (ক্যানোনিকাল JSON) ভালভাবে রক্ষণাবেক্ষণ ও নিরীক্ষণকৃত লাইব্রেরি।
একটি প্রোডাকশন রসিদ লাইব্রেরি ব্যবহার করুন। বেশ কয়েকটি ওপেন-সোর্স প্রকল্প ঐ প্যাটার্ন অতিরিক্ত বৈশিষ্ট্য (কী রোটেশন, ব্যাচ যাচাই, JWK সেট বিতরণ, নীতি ইঞ্জিনের সাথে ইন্টিগ্রেশন) নিয়ে বাস্তবায়ন করে:
draft-farley-acta-signed-receipts), যা বর্তমানে স্ট্যান্ডার্ড প্রক্রিয়াধীন।protect-mcp (npm) এবং @veritasacta/verify (npm) প্যাকেজগুলো Node-ভিত্তিক রসিদ সাইনিং এবং অফলাইন যাচাইয়ের বাস্তবায়ন দেয়, যেকোন MCP সার্ভারকে ট্যাম্পার-এভিডেন্ট অডিট ট্রেইল দিয়ে মোড়ানোর জন্য।নিজে কোড লেখা ও লাইব্রেরি ব্যবহারের মধ্যে সিদ্ধান্ত JWT লাইব্রেরি ব্যবহারের মতো: দুটোই যুক্তিসঙ্গত; লাইব্রেরি সময় সাশ্রয় করে এবং অডিট পৃষ্ঠ কিছু কমায়; নতুন কোড বুঝতে বাধ্য করে আপনাকে প্রতিটি প্রিমিটিভ। এই পাঠ from-scratch পথ শেখায় যাতে আপনার কাছে যে কোনো বিকল্পের জন্য ভিত্তি থাকে।
অনুশীলনে যাওয়ার আগে আপনার বোঝাপড়া পরীক্ষা করুন।
১. একটি রসিদ এজেন্টের প্রাইভেট Ed25519 কী দিয়ে সই করা। অডিটরের কাছে কেবল পাবলিক কী আছে। অডিটর কি রসিদ অফলাইনে যাচাই করতে পারে?
২. এক আক্রমণকারী একটি রসিদের policy_id ক্ষেত্র পরিবর্তন করেছে এবং দাবি করেছে এটি অধিক শিথিল নীতিবিধির অধীনে ছিল। স্বাক্ষর ছিল মূল পে-লোডে। যাচাই কল মাত্র কী হয়?
৩. রসিদ কেন কাঁচা আর্গুমেন্ট এবং ফলাফল না দিয়ে tool_args_hash এবং result_hash অন্তর্ভুক্ত করে?
৪. previous_receipt_hash প্রতিটি রসিদকে পূর্ববর্তী রসিদের সাথে যুক্ত করে। যদি এক আক্রমণকারী চেইনের মাঝ থেকে নিঃশব্দে একটি রসিদ মুছে ফেলে, কী অবৈধ হবে?
৫. একটি রসিদ স্বচ্ছন্দে যাচাই হলো। এতে কি প্রমাণ হয় যে এজেন্টের কাজ সঠিক, সাউন্ড, বা নীতির সাথে সামঞ্জস্যপূর্ণ?
code_samples/18-signed-receipts.ipynb খুলুন এবং চারটি অংশ সম্পন্ন করুন:
১. অংশ ১: আপনার প্রথম রসিদ সই করুন এবং যাচাই করুন। ২. অংশ ২: রসিদে ট্যাম্পার করুন এবং যাচাই ব্যর্থ দেখুন। ৩. অংশ ৩: তিনটি রসিদের চেইন তৈরি করুন এবং চেইন অখণ্ডতা যাচাই করুন। ৪. অংশ ৪: Microsoft Agent Framework দিয়ে একটি এজেন্টে প্যাটার্ন প্রয়োগ করুন: টুল কল রসিদ-সাইনে মোড়ান, তারপর রসিদ স্বতন্ত্রভাবে যাচাই করুন।
স্ট্রেচ চ্যালেঞ্জ ১: আপনার পছন্দসই অতিরিক্ত ক্ষেত্র দিয়ে রসিদ স্কিমা সম্প্রসারিত করুন (উদাহরণস্বরূপ, ট্রেসিংয়ের জন্য রিকোয়েস্ট আইডি), ক্যানোনিকাল সাইনিং লজিকে এটি যোগ করুন, এবং যাচাই নিশ্চিত করুন রসিদ এখনও সত্য সঞ্চার করে। তারপর সাইন করার পর ক্ষেত্রটি পরিবর্তন করুন এবং যাচাই ব্যর্থ দেখুন। এটি আপনাকে বুঝতে সাহায্য করবে কীভাবে ক্যানোনিকাল এনকোডিংয়ের প্রতিটি বাইট স্বাক্ষরের সাথে সম্পর্কিত। স্ট্রেচ চ্যালেঞ্জ ২: আপনার দুটি রশিদ SHA-256 হ্যাশ করুন (তাদের ক্যানোনিকাল বাইটগুলি একটি নির্ধারিত ক্রমে সংযুক্ত করুন) এবং ফলাফল সংক্ষেপটিকে একটি তৃতীয় রশিদের উপর একটি নতুন ক্ষেত্র হিসাবে এম্বেড করুন তারপর এটি স্বাক্ষর করুন। নিশ্চিত করুন যে সমস্ত তিনটি রশিদ এখনও রাউন্ড-ট্রিপ হচ্ছে। আপনি ঠিকই একটি একধাপের অন্তর্ভুক্তি প্রমাণ তৈরি করেছেন: কেউ যিনি তৃতীয় রশিদটি ধারণ করেন তারা প্রমাণ করতে পারেন প্রথম দুটি তখনই বিদ্যমান ছিল যখন এটি স্বাক্ষরিত হয়েছিল, তাদের বিষয়বস্তু প্রকাশ না করিয়েই। এটি সেই প্যাটার্ন যা নির্বাচনী-উন্মোচন রশিদ বড় পরিসরে ব্যবহার করে (Merkle commitments, RFC 6962)।
ক্রিপ্টোগ্রাফিক রশিদগুলো এআই এজেন্টদের একটি অডিট ট্রেল প্রদান করে যা:
এগুলো ইনপুট যাচাই, নীতি প্রয়োগ, বা পরিচয় অবকাঠামোর বিকল্প নয়। এরা সেই স্তরগুলোর ভিত্তি। যখন আপনি নিয়ন্ত্রিত ওয়ার্কলোডে, বহু-সংগঠন ওয়ার্কফ্লোতে, বা কোনো এমন পরিবেশে এজেন্ট প্রয়োগ করবেন যেখানে ভবিষ্যতের একজন অডিটর আপনাকে বিশ্বাস করবেন না, তখন রশিদ হল কীভাবে আপনি অডিট ট্রেলকে সৎ রাখবেন।
সবচেয়ে গুরুত্বপূর্ণ সার সংক্ষেপ: রশিদ প্রমাণ করে কে কি বলেছিল, কবে। তারা প্রমাণ করে না যে যা বলা হয়েছে তা সত্য বা সঠিক। এই পার্থক্যটি দৃঢ়ভাবে ধরে রাখুন। এটি একটি সৎ প্রমাণন ব্যবস্থা এবং বিভ্রান্তিকর ব্যবস্থার মধ্যে পার্থক্য।
যখন আপনি এই পাঠ থেকে গ্র্যাজুয়েট হয়ে রশিদ-স্বাক্ষরিত এজেন্ট বাস্তব পরিবেশে প্রয়োগ করতে প্রস্তুত:
https://your-org.example.com/.well-known/agent-keys.json।অন্য শিক্ষার্থীদের সাথে দেখা করতে, অফিস আওয়ার এ অংশ নিতে, এবং আপনার AI এজেন্ট সম্পর্কিত প্রশ্নের উত্তর পেতে Microsoft Foundry Discord এ যোগ দিন।
এই পাঠে একটি একক রশিদ স্বাক্ষর এবং হ্যাশ-চেইনড সিকোয়েন্স কভার করা হয়েছে। একই প্রিমিটিভগুলো একত্রিত হয়ে আরো উন্নত প্যাটার্ন তৈরি করে যা আপনি গভর্নেন্স অবস্থান মজবুত হওয়ার সাথে পেতে পারেন:
authorization_*) এবং পোস্ট-প্রযোজন (result_*) অর্ধেক ভাগ করে স্বাধীন স্বাক্ষরসহ প্রদান করে, যখন অনুমোদনের সিদ্ধান্ত এবং পরিণতি আলাদা নির্মাতাদের বা সময়ে তৈরি হয়। এটি এই পাঠে শেখানো রশিদ ফরম্যাটের উপরে সংযোজনীয়।result_hash-এ যত বাইট দিয়েছেন তা সিল করে। বাস্তবায়নে পেআলোড অনেক বেশি বিস্তৃত হতে পারে: পূর্ব-সিদ্ধান্তযুক্ত যুক্তি (মডেল ভবিষ্যদ্বাণী, বিবেচিত বিকল্প, প্রমাণ এবং তার সম্পূর্ণতা, ঝুঁকি মনোভাব, দায়বদ্ধতা চেইন, গেট ফলাফল) সব একটি রশিদের অন্তর্ভুক্ত থাকতে পারে। এটি রশিদ ফরম্যাটকে ছোট রাখে এবং পেআলোড স্কিমাগুলোর ডোমেন-ভিত্তিক বিকাশ সম্ভব করে।signature.alg ক্ষেত্র বহন করতে পারে ML-DSA-65 (NIST পোস্ট-কোয়ান্টাম স্বাক্ষর স্ট্যান্ডার্ড) যখন স্থানান্তর দরকার হয়। একটি স্থানান্তর সময়সীমার পরিকল্পনা করুন যেখানে রশিদ দ্বি-স্বাক্ষরিত হবে।কম্পিউটার ইউজ এজেন্ট তৈরি (CUA)
(কারিকুলাম রক্ষণাবেক্ষকরা নির্ধারণ করবেন)
অস্বীকৃতি: এই নথিটি AI অনুবাদ পরিষেবা Co-op Translator ব্যবহার করে অনূদিত হয়েছে। যদিও আমরা শুদ্ধতার জন্য চেষ্টা করি, অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল নথিটি তার স্বভাষায় কর্তৃত্বপূর্ণ উৎস হিসেবে বিবেচিত হওয়া উচিত। গুরুত্বপূর্ণ তথ্যের জন্য পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদের ব্যবহারে প্রয়োজনীয় ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়বদ্ধ নই।