Παρακολουθήστε το βίντεο μαθήματος: Ασφάλεια των Πρακτόρων AI με Κρυπτογραφικές Αποδείξεις
(Το βίντεο μαθήματος και η μικρογραφία θα προστεθούν από την ομάδα περιεχομένου της Microsoft μετά τη συγχώνευση, σύμφωνα με το πρότυπο των μαθημάτων 14 / 15.)
Αυτό το μάθημα θα καλύψει:
Μετά την ολοκλήρωση αυτού του μαθήματος, θα γνωρίζετε πώς να:
Φανταστείτε ότι έχετε αναπτύξει έναν πράκτορα AI για την Contoso Travel. Ο πράκτορας διαβάζει αιτήματα πελατών, καλεί ένα API πτήσεων για να βρει επιλογές και κλείνει θέσεις για λογαριασμό του πελάτη. Το προηγούμενο τρίμηνο, ο πράκτορας επεξεργάστηκε 50.000 κρατήσεις.
Σήμερα έρχεται ένας επιθεωρητής. Κάνει μια απλή ερώτηση: «Δείξτε μου τι έκανε ο πράκτοράς σας.»
Εσείς παραδίδετε τα αρχεία καταγραφής. Ο επιθεωρητής τα κοιτάζει και κάνει την πιο δύσκολη ερώτηση: «Πώς ξέρω ότι αυτά τα αρχεία καταγραφής δεν τροποποιήθηκαν;»
Αυτό είναι το πρόβλημα του ίχνους ελέγχου. Στις περισσότερες αναπτύξεις πρακτόρων σήμερα χρησιμοποιούνται:
Κανένα από αυτά δεν μπορεί να απαντήσει στην ερώτηση του επιθεωρητή χωρίς να απαιτεί από τον επιθεωρητή να εμπιστευτεί κάποιον (εσάς, τον πάροχο cloud, τον προμηθευτή βάσης δεδομένων). Για εσωτερική χρήση, αυτή η εμπιστοσύνη είναι συνήθως αποδεκτή. Για ρυθμιζόμενα φορτία εργασίας (χρηματοοικονομικά, υγειονομική περίθαλψη, οτιδήποτε υπόκειται στον Κανονισμό για την 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 -- ναι --> 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). Αυτό εξασφαλίζει ότι δύο υλοποιήσεις που παράγουν την ίδια λογική απόδειξη παράγουν και ακριβώς ίδια σε bytes έξοδο. Χωρίς κανονικοποίηση, διαφορετικοί σειριοποιητές JSON θα παρήγαγαν διαφορετικές υπογραφές για το ίδιο περιεχόμενο.
Αλυσοδεμένος κατακερματισμός. Το πεδίο previous_receipt_hash συνδέει κάθε απόδειξη με την προηγούμενη. Η αφαίρεση ή η αναδιάταξη μιας απόδειξης σπάει κάθε απόδειξη που ακολουθεί. Η παραποίηση γίνεται ορατή σε επίπεδο αλυσίδας ακόμη κι αν ξεπεραστούν ξεχωριστές υπογραφές.
Μαζί αυτές οι ιδιότητες παρέχουν τρεις εγγυήσεις:
Δεν χρειάζεστε ειδική βιβλιοθήκη για να παράγετε μια απόδειξη. Οι κρυπτογραφικές πρωτόγονες λειτουργίες είναι ευρέως διαθέσιμες και η λογική είναι μερικές δεκάδες γραμμές Python.
Οι πρακτικές ασκήσεις στο 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 -. προηγούμενο_χαρτογράφημα_απόδειξης .-> R0
R2 -. προηγούμενο_χαρτογράφημα_απόδειξης .-> R1
R3 -. προηγούμενο_χαρτογράφημα_απόδειξης .-> R2
Κάθε απόδειξη καταγράφει το κατακερματισμένο της προηγούμενης απόδειξης. Για να αφαιρέσει ένας επιτιθέμενος την απόδειξη 2 αθόρυβα, θα έπρεπε είτε να:
previous_receipt_hash της απόδειξης 3 (σπάει την υπογραφή της απόδειξης 3), ήΕάν το ιδιωτικό κλειδί είναι σε υλικό θησαυροφυλάκιο και δημοσιεύετε το δημόσιο κλειδί με κάθε απόδειξη, καμία από αυτές τις επιθέσεις δεν είναι εφικτή χωρίς ανίχνευση.
Το σημειωματάριο περνάει:
previous_receipt_hash κάθε απόδειξης ταιριάζει με τον πραγματικό κατακερματισμό της προηγούμενης.Έτσι παράγετε ένα ίχνος ελέγχου που μπορεί να επαληθεύσει εξωτερικός επιθεωρητής χωρίς να σας εμπιστευτεί.
Αυτή είναι η πιο σημαντική ενότητα αυτού του μαθήματος. Οι αποδείξεις είναι ισχυρές αλλά η ισχύς τους έχει όρια.
Οι αποδείξεις αποδεικνύουν τρία πράγματα:
Οι αποδείξεις ΔΕΝ αποδεικνύουν:
policy_id αξιολογήθηκε πράγματι ή ότι θα επέτρεπε αυτήν την ενέργεια αν ελεγχόταν. Η απόδειξη καταγράφει τι ισχυρίστηκε, όχι τι επιβλήθηκε.Αυτά τα όρια έχουν σημασία για δύο λόγους:
Ένα συνηθισμένο λάθος είναι να υποθέτετε ότι «έχουμε αποδείξεις» σημαίνει «έχουμε διακυβέρνηση». Δεν ισχύει. Οι αποδείξεις είναι η βάση. Η διακυβέρνηση είναι το σύστημα που χτίζετε από πάνω.
Ο κώδικας Python σε αυτό το μάθημα είναι σκόπιμα ελάχιστος ώστε να διαβάζετε κάθε γραμμή και να κατανοείτε ακριβώς τι συμβαίνει. Σε παραγωγή, έχετε δύο επιλογές:
Να βασιστείτε απευθείας στις κρυπτογραφικές πρωτόγονες συναρτήσεις. Οι 50 γραμμές που είδατε παραπάνω είναι επαρκείς για πολλές χρήσεις. Οι βιβλιοθήκες PyNaCl (Ed25519) και το πακέτο jcs (κανονικό JSON) είναι καλά συντηρημένες και ελεγμένες.
Να χρησιμοποιήσετε βιβλιοθήκη παραγωγής αποδείξεων. Πολλά ανοιχτού κώδικα έργα εφαρμόζουν το ίδιο πρότυπο με επιπρόσθετα χαρακτηριστικά (περιστροφή κλειδιών, ομαδική επαλήθευση, διανομή JWK Set, ενσωμάτωση με μηχανές πολιτικής):
draft-farley-acta-signed-receipts) που βρίσκεται στη διαδικασία στάνταρ.protect-mcp (npm) και @veritasacta/verify (npm) παρέχουν Node υλοποίηση υπογραφής και επαλήθευσης αποδείξεων εκτός σύνδεσης, για την τυλίγηση οποιουδήποτε MCP server με ένα ίχνος ελέγχου ανιχνεύσιμο παραποίησης.Η απόφαση μεταξύ του να φτιάξετε τη δική σας λύση ή να χρησιμοποιήσετε βιβλιοθήκη μιμείται την απόφαση μεταξύ συγγραφής δικής σας βιβλιοθήκης JWT και χρήσης δοκιμασμένης: και οι δύο είναι λογικές· η βιβλιοθήκη εξοικονομεί χρόνο και μειώνει την επιφάνεια ελέγχου· η λύση από το μηδέν σας αναγκάζει να καταλάβετε κάθε primitive. Αυτό το μάθημα διδάσκει τον δρόμο από το μηδέν ώστε να έχετε τη βάση για οποιαδήποτε επιλογή.
Ελέγξτε την κατανόησή σας πριν προχωρήσετε στην πρακτική άσκηση.
1. Μια απόδειξη υπογράφεται με το ιδιωτικό κλειδί Ed25519 του πράκτορα. Ο επιθεωρητής έχει μόνο το δημόσιο κλειδί. Μπορεί ο επιθεωρητής να επαληθεύσει την απόδειξη εκτός σύνδεσης;
2. Ένας επιτιθέμενος τροποποιεί το πεδίο policy_id μιας απόδειξης για να υποστηρίξει ότι κυβερνήθηκε από πιο επιεική πολιτική. Η υπογραφή ήταν πάνω στο αρχικό φορτίο. Τι συμβαίνει κατά την επαλήθευση;
3. Γιατί η απόδειξη περιλαμβάνει tool_args_hash και result_hash αντί για τις ακατέργαστες παραμέτρους και το αποτέλεσμα;
4. Το πεδίο previous_receipt_hash συνδέει κάθε απόδειξη με την προηγούμενή της. Αν ένας επιτιθέμενος διαγράψει αθόρυβα μια απόδειξη από τη μέση αλυσίδας, τι καθίσταται άκυρο;
5. Μια απόδειξη επαληθεύεται κανονικά. Αποδεικνύει αυτό ότι η ενέργεια του πράκτορα ήταν σωστή, ορθή ή συμμόρφωση με πολιτική;
Ανοίξτε το code_samples/18-signed-receipts.ipynb και ολοκληρώστε και τις τέσσερις ενότητες:
Πρόκληση επιπλέον 1: επεκτείνετε το σχήμα απόδειξης με ένα επιπρόσθετο πεδίο της επιλογής σας (π.χ. ένα ID αιτήματος για ιχνηλάτηση), ενημερώστε τη λογική κανονικής υπογραφής να το συμπεριλαμβάνει, και επιβεβαιώστε ότι η απόδειξη περνάει ξανά την επαλήθευση. Μετά τροποποιήστε το πεδίο μετά την υπογραφή και επιβεβαιώστε ότι η επαλήθευση αποτυγχάνει. Αυτό σας αναγκάζει να κατανοήσετε πώς κάθε byte της κανονικής κωδικοποίησης συμβάλλει στην υπογραφή. Πρόκληση επέκτασης 2: Δημιουργήστε SHA-256 hash δύο αποδείξεών σας μαζί (συνδέστε τα κανονικά bytes τους με έναν καθοριστικό τρόπο) και ενσωματώστε το προκύπτον digest ως νέο πεδίο σε μια τρίτη απόδειξη προτού την υπογράψετε. Επαληθεύστε ότι και οι τρεις αποδείξεις παραμένουν πλήρως ελεγμένες και επαληθεύσιμες. Μόλις δημιουργήσατε μια απόδειξη ενσωμάτωσης ενός βήματος: οποιοσδήποτε έχει την τρίτη απόδειξη μπορεί να αποδείξει ότι οι δύο πρώτες υπήρχαν τη στιγμή που υπογράφηκε, χωρίς να χρειαστεί να αποκαλύψει το περιεχόμενό τους. Αυτό είναι το μοτίβο που χρησιμοποιούν σε μεγάλη κλίμακα οι αποδείξεις με επιλεκτική αποκάλυψη (Merkle commitments, RFC 6962).
Οι κρυπτογραφικές αποδείξεις παρέχουν στους πράκτορες AI ένα ίχνος ελέγχου που είναι:
Δεν είναι υποκατάστατο της επαλήθευσης εισόδου, της επιβολής πολιτικής ή της υποδομής ταυτότητας. Είναι το θεμέλιο για αυτές τις στρώσεις. Όταν αναπτύσσετε πράκτορες σε ελεγχόμενα εργασιακά φορτία, πολυ-οργανωτικά ροή εργασίας ή οποιοδήποτε περιβάλλον όπου ένας μελλοντικός ελεγκτής δεν μπορεί να υποτεθεί ότι σας εμπιστεύεται, οι αποδείξεις είναι ο τρόπος με τον οποίο κάνετε ειλικρινές το ίχνος ελέγχου.
Το πιο σημαντικό συμπέρασμα: οι αποδείξεις αποδεικνύουν ποιος είπε τι, πότε. Δεν αποδεικνύουν ότι αυτό που ειπώθηκε ήταν αληθινό ή σωστό. Κρατήστε αυτή τη διάκριση αυστηρά. Είναι η διαφορά μεταξύ ενός έντιμου συστήματος προέλευσης και ενός παραπλανητικού.
Όταν είστε έτοιμοι να προχωρήσετε από αυτό το μάθημα στην ανάπτυξη πρακτόρων με υπογεγραμμένες αποδείξεις σε πραγματικό περιβάλλον:
https://your-org.example.com/.well-known/agent-keys.json.Ενταχθείτε στο Microsoft Foundry Discord για να συναντήσετε άλλους εκπαιδευόμενους, να παρακολουθήσετε ώρες γραφείου και να λύσετε τις απορίες σας για τους Πράκτορες AI.
Αυτό το μάθημα καλύπτει μονή υπογραφή απόδειξης και αλυσίδες με hash. Οι ίδιες πρωτόκολλες συνθέτουν πολλά πιο προχωρημένα μοτίβα που μπορεί να συναντήσετε καθώς αναπτύσσεται η διακυβέρνησή σας:
authorization_*) και μετά την εκτέλεση (result_*) με ανεξάρτητες υπογραφές, χρήσιμο όταν η απόφαση εξουσιοδότησης και το παρατηρούμενο αποτέλεσμα προέρχονται από διαφορετικούς φορείς ή χρονικές στιγμές. Προστίθεται επικάλυψη πάνω στη μορφή απόδειξης που διδάχθηκε σε αυτό το μάθημα.result_hash. Πραγματικά δεδομένα είναι συχνά πλουσιότερα από το αποτέλεσμα μιας μόνο κλήσης εργαλείου: προεκτιμήσεις (μοντέλο, επιλογές που εξετάστηκαν, αποδεικτικά στοιχεία και η πληρότητά τους, στάση κινδύνου, αλυσίδα υπευθυνότητας, αποτέλεσμα πυλών) μπορούν να ζουν μέσα στο payload, κλειδωμένα από μία μόνο απόδειξη. Έτσι η μορφή της απόδειξης παραμένει ελάχιστη ενώ τα schema payload εξελίσσονται ανά τομέα.signature.alg μπορεί να μεταφέρει ML-DSA-65 (το πρότυπο υπογραφής μετά-κβαντικής του NIST) όταν χρειαστείτε μετάβαση. Προγραμματίστε μια περίοδο μετάβασης όπου οι αποδείξεις θα έχουν διπλές υπογραφές.Building Computer Use Agents (CUA)
(Θα καθοριστεί από τους συντηρητές του προγράμματος σπουδών)
Αποποίηση ευθυνών: Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία μετάφρασης με τεχνητή νοημοσύνη Co-op Translator. Ενώ επιδιώκουμε την ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή λανθασμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.