Watch the lesson video: Ασφάλεια των Πρακτόρων Τεχνητής Νοημοσύνης με Κρυπτογραφικές Αποδείξεις
(Το βίντεο μαθήματος και η μικρογραφία θα προστεθούν από την ομάδα περιεχομένου της Microsoft μετά τη συγχώνευση, ταιριάζοντας στο μοτίβο των μαθημάτων 14 / 15.)
Αυτό το μάθημα θα καλύψει:
Μετά την ολοκλήρωση αυτού του μαθήματος, θα γνωρίζετε πώς να:
Φανταστείτε ότι έχετε αναπτύξει έναν πράκτορα ΤΝ για την Contoso Travel. Ο πράκτορας διαβάζει αιτήματα πελατών, καλεί ένα API πτήσεων για να βρει επιλογές, και κλείνει θέσεις εκ μέρους του πελάτη. Το προηγούμενο τρίμηνο, ο πράκτορας επεξεργάστηκε 50.000 κρατήσεις.
Σήμερα έρχεται ένας ελεγκτής. Κάνει απλή ερώτηση: “Δείξτε μου τι έκανε ο πράκτοράς σας.”
Παραδίδετε τα αρχεία καταγραφής σας. Ο ελεγκτής τα κοιτάζει και κάνει την πιο δύσκολη ερώτηση: “Πώς ξέρω ότι αυτά τα αρχεία δεν έχουν υποστεί επεξεργασία;”
Αυτό είναι το πρόβλημα του αρχείου ελέγχου. Οι περισσότερες αναπτύξεις πρακτόρων σήμερα βασίζονται σε:
Κανένα από αυτά δεν μπορεί να απαντήσει στην ερώτηση του ελεγκτή χωρίς να απαιτείται να εμπιστεύεται κάποιος (εσάς, τον πάροχο του cloud, τον προμηθευτή της βάσης δεδομένων). Για εσωτερική χρήση, αυτή η εμπιστοσύνη συνήθως είναι αποδεκτή. Για ρυθμιζόμενα φορτία εργασίας (χρηματοοικονομικά, υγεία, οτιδήποτε υπόκειται στον Κανονισμό ΤΝ της ΕΕ) δεν είναι.
Οι κρυπτογραφικές αποδείξεις λύνουν αυτό το πρόβλημα καθιστώντας κάθε ενέργεια πράκτορα ανεξάρτητα επαληθεύσιμη. Ο ελεγκτής δεν χρειάζεται να σας εμπιστεύεται. Χρειάζεται μόνο το δημόσιο κλειδί σας και την ίδια την απόδειξη.
Μια απόδειξη είναι ένα αντικείμενο JSON που καταγράφει τι έκανε ένας πράκτορας, υπογεγραμμένο με ψηφιακή υπογραφή.
flowchart LR
A[Ο αντιπρόσωπος καλεί ένα εργαλείο] --> B[Δημιουργία φορτίου απόδειξης]
B --> C[Κανoνικοποίηση JSON RFC 8785]
C --> D[Κατακερματισμός SHA-256]
D --> E[Υπογραφή Ed25519]
E --> F[Απόδειξη με υπογραφή]
F --> G[Ο ελεγκτής επαληθεύει εκτός σύνδεσης]
G --> H{Η υπογραφή είναι έγκυρη;}
H -- ναι --> I[Απόδειξη ανθεκτική σε παραποίηση]
H -- όχι --> 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). Αυτό διασφαλίζει ότι δύο υλοποιήσεις που παράγουν την ίδια λογική απόδειξη παράγουν byte-ταυτόσημη έξοδο. Χωρίς την κανονικοποίηση, διαφορετικοί σειριοποιητές JSON θα παράγουν διαφορετικές υπογραφές για το ίδιο περιεχόμενο.
Αλυσιδωτή καταχώρηση hash. Το πεδίο previous_receipt_hash συνδέει κάθε απόδειξη με την προηγούμενη. Η αφαίρεση ή η αλλαγή σειράς μιας απόδειξης σπάει κάθε απόδειξη που ακολουθεί. Η παραποίηση καθίσταται ορατή σε επίπεδο αλυσίδας ακόμα κι αν παρακαμφθούν μεμονωμένες υπογραφές.
Μαζί αυτές οι ιδιότητες παρέχουν τρεις εγγυήσεις:
Δεν χρειάζεστε ειδική βιβλιοθήκη για να παράγετε μια απόδειξη. Οι κρυπτογραφικές πρωτόγονες λειτουργίες είναι ευρέως διαθέσιμες και η λογική είναι μερικές δεκάδες γραμμές Python.
Οι πρακτικές ασκήσεις στο code_samples/18-signed-receipts.ipynb σας καθοδηγούν σε όλη τη διαδικασία. Η συνοπτική έκδοση:
import json
import hashlib
import base64
from nacl import signing
from jcs import canonicalize # Πρότυπο JSON κανονικοποιημένο σύμφωνα με το RFC 8785
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
Κάθε απόδειξη καταγράφει το hash της προηγούμενης απόδειξης. Για να αφαιρέσει σιωπηλά κάποιος την απόδειξη 2, θα χρειαζόταν:
previous_receipt_hash της απόδειξης 3 (ακυρώνει την υπογραφή της απόδειξης 3), ΉΑν το ιδιωτικό κλειδί φυλάσσεται σε ένα hardware key vault και δημοσιεύετε το δημόσιο κλειδί με κάθε απόδειξη, καμία από αυτές τις επιθέσεις δεν είναι εφικτή χωρίς ανίχνευση.
Το σημειωματάριο περνάει από:
previous_receipt_hash κάθε απόδειξης ταιριάζει με το πραγματικό hash της προηγούμενης απόδειξης.Αυτός είναι ο τρόπος να παραχθεί ένα αρχείο ελέγχου που ένας εξωτερικός ελεγκτής μπορεί να επαληθεύσει χωρίς να χρειάζεται να σας εμπιστευτεί.
Αυτή είναι η πιο σημαντική ενότητα αυτού του μαθήματος. Οι αποδείξεις είναι ισχυρές αλλά η ισχύς τους έχει όρια.
Οι αποδείξεις αποδεικνύουν τρία πράγματα:
Οι αποδείξεις ΔΕΝ αποδεικνύουν:
policy_id αξιολογήθηκε πραγματικά, ή ότι θα επέτρεπε αυτή την ενέργεια αν είχε ελεγχθεί. Η απόδειξη καταγράφει τι δήλωσε, όχι τι επιβλήθηκε.Αυτό το όριο έχει σημασία για δύο λόγους:
Συχνό λάθος είναι να υποθέσετε ότι “έχουμε αποδείξεις” σημαίνει “είμαστε ρυθμιζόμενοι”. Δεν σημαίνει. Οι αποδείξεις είναι θεμέλιο. Η διακυβέρνηση είναι το σύστημα που χτίζετε από πάνω.
Ο κώδικας Python σε αυτό το μάθημα είναι σκόπιμα ελάχιστος ώστε να μπορείτε να διαβάσετε κάθε γραμμή και να καταλάβετε ακριβώς τι συμβαίνει. Σε περιβάλλον παραγωγής, έχετε δύο επιλογές:
Κατασκευή απευθείας πάνω στις κρυπτογραφικές πρωτόγονες λειτουργίες. Οι 50 γραμμές που είδατε παραπάνω επαρκούν για πολλές περιπτώσεις χρήσης. Οι PyNaCl (Ed25519) και το πακέτο jcs (κανονικό JSON) είναι καλά συντηρημένες και ελεγμένες βιβλιοθήκες.
Χρήση βιβλιοθήκης απόδειξης παραγωγής. Πολλά έργα ανοικτού κώδικα υλοποιούν το ίδιο πρότυπο με πρόσθετα χαρακτηριστικά (περιστροφή κλειδιών, επαύξηση παρτίδων, διανομή συνόλου JWK, ενσωμάτωση με μηχανές πολιτικής):
draft-farley-acta-signed-receipts) που βρίσκεται στη διαδικασία προτύπων.protect-mcp (npm) και @veritasacta/verify (npm) παρέχουν Node-based υλοποίηση για υπογραφή αποδείξεων και επαλήθευση εκτός σύνδεσης, σχεδιασμένα για να τυλίγουν οποιονδήποτε MCP server με αλυσίδα αρχείου ελέγχου ανιχνεύσιμης παραποίησης.pip install nobulex) παρέχει το ίδιο πρότυπο υπογραφής Ed25519 + JCS σε Python με ενσωματώσεις LangChain και CrewAI, συμπεριλαμβανομένων δημοσιευμένων διασταυρούμενων δοκιμαστικών διανυσμάτων και ενός χάρτη συμμόρφωσης που συνεισέφερε μέσω του OWASP PR #2210.Η επιλογή μεταξύ συγγραφής δικής σας βιβλιοθήκης και χρήσης έτοιμης είναι ανάλογη της επιλογής μεταξύ υλοποίησης δικής σας JWT βιβλιοθήκης και χρήσης μιας δοκιμασμένης: και οι δύο λογικές· η βιβλιοθήκη εξοικονομεί χρόνο και μειώνει το πεδίο ελέγχου· η υλοποίηση από την αρχή σας αναγκάζει να κατανοήσετε κάθε πρωτόγονο λειτουργικό. Αυτό το μάθημα διδάσκει την προσέγγιση από το μηδέν ώστε να έχετε τα θεμέλια για οποιαδήποτε επιλογή.
Δοκιμάστε την κατανόησή σας πριν προχωρήσετε στην πρακτική άσκηση.
1. Μια απόδειξη υπογράφεται με το ιδιωτικό κλειδί Ed25519 του πράκτορα. Ο ελεγκτής έχει μόνο το δημόσιο κλειδί. Μπορεί ο ελεγκτής να επαληθεύσει την απόδειξη εκτός σύνδεσης;
2. Ένας επιτιθέμενος τροποποιεί το πεδίο policy_id μιας απόδειξης για να ισχυριστεί ότι κυβερνιόταν από πιο επιεική πολιτική. Η υπογραφή ήταν πάνω στο αρχικό φορτίο. Τι συμβαίνει κατά την επαλήθευση;
3. Γιατί η απόδειξη περιλαμβάνει tool_args_hash και result_hash αντί για τα ακατέργαστα επιχειρήματα και αποτελέσματα;
4. Το πεδίο previous_receipt_hash συνδέει κάθε απόδειξη με την προηγούμενή της. Αν ένας επιτιθέμενος αφαιρέσει σιωπηλά μια απόδειξη από τη μέση της αλυσίδας, τι καθίσταται άκυρο;
5. Μια απόδειξη επαληθεύεται καθαρά. Αυτό αποδεικνύει ότι η ενέργεια του πράκτορα ήταν σωστή, ορθή ή σύμφωνα με την πολιτική;
Ανοίξτε το code_samples/18-signed-receipts.ipynb και ολοκληρώστε και τις τέσσερις ενότητες:
Πρόκληση επέκτασης 2: κάντε SHA-256 hash δύο από τις αποδείξεις σας μαζί (συνενώστε τις κανονικές bytes τους με καθορισμένη σειρά) και ενσωματώστε το προκύπτον digest ως νέο πεδίο σε μια τρίτη απόδειξη πριν την υπογράψετε. Επιβεβαιώστε ότι και οι τρεις αποδείξεις εξακολουθούν να περνούν τον έλεγχο. Μόλις δημιουργήσατε μια απόδειξη ενσωμάτωσης ενός βήματος: όποιος κατέχει την τρίτη απόδειξη μπορεί να αποδείξει ότι οι δύο πρώτες υπήρχαν τη στιγμή που υπογράφηκε, χωρίς να χρειάζεται να αποκαλύψει το περιεχόμενό τους. Αυτό είναι το πρότυπο που χρησιμοποιούν οι αποδείξεις επιλεκτικής αποκάλυψης σε μεγάλη κλίμακα (δεσμεύσεις Merkle, RFC 6962).
Οι κρυπτογραφικές αποδείξεις παρέχουν στους AI agents ένα ίχνος ελέγχου που είναι:
Δεν αποτελούν υποκατάστατο για την επικύρωση εισόδου, εφαρμογή πολιτικής ή υποδομή ταυτότητας. Αποτελούν τη βάση για αυτά τα επίπεδα. Όταν αναπτύσσετε agents σε ρυθμιζόμενα φορτία εργασίας, workflows πολλών οργανισμών ή σε οποιοδήποτε περιβάλλον όπου ένας μελλοντικός ελεγκτής δεν μπορεί να θεωρηθεί αξιόπιστος, οι αποδείξεις είναι ο τρόπος να κάνετε το ίχνος ελέγχου αξιόπιστο.
Το πιο σημαντικό συμπέρασμα: οι αποδείξεις αποδεικνύουν ποιος είπε τι και πότε. Δεν αποδεικνύουν ότι αυτό που ειπώθηκε ήταν αληθινό ή σωστό. Κρατήστε αυτήν την διάκριση καλά. Είναι η διαφορά ανάμεσα σε ένα έντιμο σύστημα προέλευσης και ένα παραπλανητικό.
Όταν είστε έτοιμοι να προχωρήσετε από το μάθημα σε ανάπτυξη agents με υπογραφή απόδειξης σε πραγματικό περιβάλλον:
https://your-org.example.com/.well-known/agent-keys.json.Γίνετε μέλος του Microsoft Foundry Discord για να συναντήσετε άλλους μαθητές, να παρακολουθήσετε ώρες γραφείου και να λάβετε απαντήσεις για θέματα AI Agents.
Αυτό το μάθημα καλύπτει υπογραφή μονής απόδειξης και αλληλουχίες με αλυσίδα hash. Τα ίδια στοιχεία συνθέτουν αρκετά πιο εξελιγμένα πρότυπα που μπορεί να συναντήσετε καθώς ωριμάζει η στάση διακυβέρνησής σας:
authorization_*) και μετά-εκτέλεσης (result_*) με ανεξάρτητες υπογραφές, χρήσιμο όταν η απόφαση εξουσιοδότησης και το παρατηρούμενο αποτέλεσμα παράγονται από διαφορετικούς φορείς ή σε διαφορετικές χρονικές στιγμές. Αυτό προστίθεται επαυξητικά πάνω στη μορφή απόδειξης που διδάχτηκε σε αυτό το μάθημα.result_hash. Τα πραγματικά φορτία είναι συχνά πλουσιότερα από το αποτέλεσμα μιας ενιαίας κλήσης εργαλείου: η σκέψη πριν τη λήψη απόφασης (πρόβλεψη μοντέλου, επιλογές που εξετάστηκαν, αποδεικτικά στοιχεία και η πληρότητά τους, στάση κινδύνου, αλυσίδα λογοδοσίας, αποτέλεσμα πύλης) μπορούν όλα να ζουν μέσα στο φορτίο, σφραγισμένα από μια μόνο απόδειξη. Αυτό διατηρεί τη μορφή απόδειξης ελάχιστη ενώ αφήνει τα σχήματα φορτίων να εξελίσσονται ανά πεδίο.signature.alg μπορεί να μεταφέρει ML-DSA-65 (το πρότυπο υπογραφής μετά την κβαντική εποχή του NIST) όταν χρειαστεί να γίνει μετάβαση. Προγραμματίστε μια περίοδο μετάβασης όπου οι αποδείξεις είναι διπλά υπογεγραμμένες.Κατασκευή Agents για Χρήση Υπολογιστή (CUA)
(Θα καθοριστεί από τους υπεύθυνους του προγράμματος σπουδών)
Αποποίηση ευθυνών: Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία μετάφρασης με τεχνητή νοημοσύνη Co-op Translator. Ενώ επιδιώκουμε την ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή λανθασμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.