Γεννήτρια κατακερματισμού και επαλήθευσης κωδικών

Κατακερματισμός και επαλήθευση κωδικών με bcrypt, scrypt, Argon2id και PBKDF2 εξ ολοκλήρου στο πρόγραμμα περιήγησης — δημιουργία συμβολοσειρών μορφής PHC, έλεγχος ενός υποψήφιου κωδικού έναντι υπάρχοντος κατακερματισμού και εξέταση των παραμέτρων που κρύβονται μέσα του. Δεν μεταφορτώνεται τίποτα.
Μόνο για δοκιμαστικούς κωδικούς. Οι πραγματικοί κωδικοί χρηστών δεν πρέπει ποτέ να επικολλώνται σε ιστοσελίδα. Αυτό το εργαλείο εκτελείται εξ ολοκλήρου στο πρόγραμμα περιήγησης — οι συμβολοσειρές δεν φεύγουν ποτέ από την καρτέλα· αλλά μια πραγματική διαρροή ξεκινά με μία και μόνη επικόλληση.
κόστος bcrypt (2^κόστος γύροι)
παραλλαγή bcrypt η παραλλαγή αλλάζει μόνο το πρόθεμα· ο ίδιος ο κατακερματισμός είναι πανομοιότυπος
scrypt N (κόστος CPU)
scrypt r / p r =   p = μέγεθος μπλοκ 128·r byte· μνήμη = 128·N·r byte (N=214, r=8 → 16 MiB)
Argon2id m (μνήμη)
Argon2id t / p t =   p = t = περάσματα· p = παραλληλισμός (λωρίδες)
PBKDF2 PRF
Επαναλήψεις PBKDF2  OWASP 2023: 600 000 για HMAC-SHA-256 (1 300 000 για SHA-1, 210 000 για SHA-384/512)
Μήκος εξόδου (byte)  Η έξοδος bcrypt είναι σταθερή στα 23 byte (31 χαρακτήρες bcrypt-base64)
ΑλγόριθμοςΠαράμετροιΜνήμηΜήκος εξόδουΧρόνος (αυτό το πρόγραμμα περιήγησης)
bcryptκόστος 124 KiB23 byte-
scryptN=214, r=8, p=116 MiB32 byte-
Argon2idm=19 MiB, t=2, p=119 MiB32 byte-
PBKDF2HMAC-SHA-256, 600 000 επαναλήψεις~032 byte-
Φύλλο αναφοράς παραμέτρων (ελάχιστα OWASP Password Storage Cheat Sheet, 2023)
ΑλγόριθμοςΕλάχιστοΣημειώσεις
Argon2idm = 19 MiB (19 456 KiB), t = 2, p = 1προτιμάται· με σκληρότητα μνήμης
scryptN = 214, r = 8, p = 1με σκληρότητα μνήμης (16 MiB στο ελάχιστο)
bcryptκόστος = 10μόνο παράγοντας εργασίας· όριο κωδικού 72 byte
PBKDF2-HMAC-SHA256600 000 επαναλήψειςμόνο σκληρότητα επαναλήψεων — φιλικό προς GPU, τελευταία επιλογή
Οι προεπιλογές αυτής της σελίδας βρίσκονται στο ή πάνω από κάθε ελάχιστο. Για παραγωγή, προτιμάται πρώτα το Argon2id, το scrypt ή το bcrypt αν δεν είναι διαθέσιμο, και το PBKDF2 μόνο για λόγους συμμόρφωσης με FIPS.
Διαλειτουργικότητα με PHP — το password_hash($pw, PASSWORD_BCRYPT) παράγει $2y$10$...: με επικόλληση του στην Επαλήθευση και τον υποψήφιο κωδικό η σελίδα απαντά ακριβώς ό,τι θα απαντούσε η password_verify(). Η έξοδος PASSWORD_ARGON2ID ($argon2id$v=19$m=65536,t=4,p=1$...) επαληθεύεται επίσης. Αναλύονται και οι συμβολοσειρές PHC από passlib, django-argon2 και το περιτύλιγμα crypto.scrypt.
Αυτοέλεγχος
Επανεκτελεί τη μηχανή της σελίδας έναντι δημόσιων διανυσμάτων: τη σουίτα δοκιμών crypt_blowfish για bcrypt, συμβολοσειρές scrypt και Argon2id που παράγονται από node/OpenSSL, τα διανύσματα PBKDF2 του RFC 6070 και το δημόσιο σύνολο SHA-256, καθώς και κύκλους δημιουργίας-επαλήθευσης σε κάθε αλγόριθμο και αρνητικά τεστ (ο λάθος κωδικός πρέπει να αποτύχει, οι κακοσχηματισμένες συμβολοσειρές πρέπει να απορρίπτονται). Τίποτα δεν αποστέλλεται πουθενά.
Ο κατακερματισμός κωδικών εξηγείται από το μηδέν
Σε μία πρόταση: ο κατακερματισμός κωδικού είναι σκόπιμα αργός (και κατά προτίμηση λιμοκτονεί σε μνήμη) ώστε η κλοπή της βάσης δεδομένων να μην επιτρέπει σε επιτιθέμενο να δοκιμάσει δισεκατομμύρια εικασίες ανά δευτερόλεπτο — το αντίθετο στόχο από έναν γρήγορο κατακερματισμό όπως το SHA-256, που είναι φτιαγμένος για ταχύτητα.
Γιατί να μη γίνεται απλώς SHA-256 στον κωδικό;

Το SHA-256 σε σύγχρονη GPU τρέχει με δισεκατομμύρια εικασίες ανά δευτερόλεπτο. Ένας κωδικός 8 χαρακτήρων έχει πολύ λιγότερους από 1013 συνδυασμούς — ώρες χρόνου GPU, λεπτά σε μεγάλη διάταξη. Οι συναρτήσεις κατακερματισμού κωδικών (KDF) το αντιμετωπίζουν με παραμέτρους κόστους: το bcrypt επαναλαμβάνει τον πυρήνα του 2cost φορές, το PBKDF2 επαναλαμβάνει HMAC εκατοντάδες χιλιάδες φορές, και τα scrypt και Argon2id ζητούν επιπλέον megabyte μνήμης ανά εικασία, ώστε οι GPU (γρήγορες αλλά φτωχές σε μνήμη ανά πυρήνα) να χάνουν το πλεονέκτημά τους. Ένα salt — τυχαίο, αποθηκευμένο ως καθαρό κείμενο μέσα στη συμβολοσειρά κατακερματισμού — σταματά τους προϋπολογισμένους rainbow tables και αναγκάζει κάθε εικασία να υπολογίζεται εκ νέου για κάθε χρήστη.

Οι τέσσερις αλγόριθμοι αυτής της σελίδας
ΑλγόριθμοςΈτοςΣκληρότηταΜορφή υπογραφήςΠροσοχή σε
bcrypt1999CPU (2κόστος ρυθμίσεις κλειδιού)$2b$12$ + salt 22 χαρακτήρων + κατακερματισμός 31 χαρακτήρωνόριο κωδικού 72 byte (ό,τι υπερβαίνει τα 72 αγνοείται σιωπηλά· το byte NUL τερματίζει τον κωδικό στην αρχική υλοποίηση C)
PBKDF22000 (RFC 2898/8018)CPU (επαναλήψεις)$pbkdf2-sha256$i=600000$ + salt + κατακερματισμός (ύφος passlib)χωρίς κόστος μνήμης — το προτιμούν οι GPU και τα ASIC· μόνο το πλήθος επαναλήψεων ρυθμίζεται
scrypt2009 (RFC 7914)CPU + μνήμη (128·N·r byte)$scrypt$ln=14,r=8,p=1$ + salt + κατακερματισμόςτο N πρέπει να είναι δύναμη του 2· η μνήμη αυξάνεται γραμμικά με το r
Argon2id2015 (νικητής PHC, RFC 9106)CPU + μνήμη (m KiB, t περάσματα)$argon2id$v=19$m=19456,t=2,p=1$ + salt + κατακερματισμόςArgon2i (ανεξάρτητο από δεδομένα) έναντι Argon2d (εξαρτώμενο από δεδομένα) έναντι Argon2id (υβριδικό) — να επιλέγεται πάντα το id, εκτός αν υπάρχει ειδικός λόγος
Σκληρότητα μνήμης έναντι σκληρότητας υπολογισμού

Μια GPU έχει χιλιάδες πυρήνες, αλλά κάθε πυρήνας έχει πρόσβαση σε λίγη γρήγορη μνήμη. Μια KDF που χρειάζεται 19 MiB ενεργού συνόλου ανά εικασία περιορίζει τον επιτιθέμενο σε τόσες παράλληλες εικασίες όσα τμήματα 19 MiB μνήμης διαθέτει — γι' αυτό το Argon2id στα 19 MiB μπορεί στην πράξη να είναι ισχυρότερο από το bcrypt με κόστος 15, παρόλο που χρειάζεται λιγότερο πραγματικό χρόνο στον φορητό υπολογιστή. Το PBKDF2 δεν έχει απάντηση σε αυτό: ο μόνος του μοχλός είναι το πλήθος επαναλήψεων, και το πυρίτιο κλιμακώνει αυτό γραμμικά.

Ανάγνωση συμβολοσειράς PHC

Η μορφή modular-crypt / PHC περιγράφει τον εαυτό της: στο $argon2id$v=19$m=19456,t=2,p=1$ICEiIyQlJicoKSorLC0uLw$WTGpK4hf... τα πεδία είναι ο αλγόριθμος, η έκδοση, οι παράμετροι (m = μνήμη σε KiB, t = περάσματα, p = λωρίδες), το salt σε base64, ο κατακερματισμός σε base64. Το bcrypt προηγείται του προτύπου και χρησιμοποιεί τη δική του συμπαγή μορφή: $2b$ παραλλαγή, 12 κόστος, και έπειτα salt και κατακερματισμός στη δική του αλφάβητο base64 του bcrypt (./A-Za-z0-9). Η Επαλήθευση αυτής της σελίδας δέχεται όλα αυτά και εμφανίζει τα αναλυμένα πεδία — με επικόλληση οποιουδήποτε κατακερματισμού και προβολή της ανάλυσής του.

Συνηθισμένα λάθη
  • Γρήγορος κατακερματισμός για κωδικούς. Οι στήλες κωδικών με MD5/SHA-1/SHA-256 πέφτουν σε GPU καταναλωτικής αγοράς με δισεκατομμύρια εικασίες ανά δευτερόλεπτο. Για αρχεία και δεδομένα χρησιμοποιείται η Γεννήτρια κατακερματισμού· για κωδικούς οι αλγόριθμοι αυτής της σελίδας.
  • Κοινή χρήση salt. Ένα salt για όλους τους χρήστες σημαίνει ότι ίσοι κωδικοί έχουν ίσους κατακερματισμούς και οι rainbow tables επιστρέφουν. Κάθε κατακερματισμός εδώ παίρνει νέο τυχαίο salt 16 byte.
  • Αγνόηση των 72 byte του bcrypt. Τα "a"*100 και "a"*72 δίνουν πανομοιότυπο κατακερματισμό — η ουρά αποκόπτεται. Αυτή η σελίδα προειδοποιεί στο πλαίσιο εισόδου όταν ο κωδικός υπερβαίνει τα 72 byte. Το Argon2 δεν έχει τέτοιο όριο.
  • Σύγκριση κατακερματισμών με == σε κώδικα εφαρμογής. Η επαλήθευση πρέπει να είναι σταθερού χρόνου· ο κινητήρας της σελίδας το κάνει εσωτερικά (επαναϋπολογίζει και συγκρίνει τα αποθηκευμένα byte), αλλά αν αντιγραφεί η προσέγγιση, πρέπει να χρησιμοποιηθεί σύγκριση σταθερού χρόνου.
  • Ρύθμιση παραμέτρων σε γρήγορο μηχάνημα ανάπτυξης. Στόχος είναι ~250–500 ms κατακερματισμού στο διάμεσο υλικό των παραγωγικών χρηστών, όχι του σταθμού εργασίας. Το κουμπί Σύγκρισης δείχνει τι βιώνει πραγματικά αυτό το πρόγραμμα περιήγησης.
  • Επανακατακερματισμός σε κάθε έλεγχο σύνδεσης. Η επαλήθευση γίνεται πρώτα· ο επανακατακερματισμός (π.χ. για αύξηση του κόστους) γίνεται μόνο μετά από επιτυχή επαλήθευση, και αποθηκεύεται η νέα συμβολοσειρά. Η συνάρτηση PHP password_needs_rehash() υπάρχει ακριβώς για αυτό.
Συχνές ερωτήσεις

Ποιον να επιλέξω; Argon2id με τουλάχιστον τα ελάχιστα του OWASP. Αν το περιβάλλον εκτέλεσης δεν το προσφέρει: scrypt, έπειτα bcrypt (με κόστος ώστε ο κατακερματισμός να διαρκεί ≥250 ms). Το PBKDF2 μόνο όπου το απαιτεί η πιστοποίηση.

Γιατί εμφανίζεται ένα τυχαίο salt στη συμβολοσειρά εξόδου; Το salt δεν είναι μυστικό — αποθηκεύεται σκόπιμα ως καθαρό κείμενο μέσα στη συμβολοσειρά PHC, ώστε η επαλήθευση να χρειάζεται μόνο τη συμβολοσειρά και τον υποψήφιο κωδικό. Ο ρόλος του είναι η μοναδικότητα, όχι η μυστικότητα.

Έχει σημασία η παραλλαγή ($2a$ / $2b$ / $2y$); Για κωδικούς ASCII παράγουν πανομοιότυπους κατακερματισμούς· το $2a$ είναι το αρχικό της δεκαετίας του 1990, το $2b$ διόρθωσε ένα σπάνιο σφάλμα επέκτασης προσήμου (2014), και το $2y$ είναι η ένδειξη της PHP ότι η διόρθωση είναι παρούσα. Η επαλήθευση δέχεται και τα τρία.

Πόσο πρέπει να διαρκεί ένας κατακερματισμός; Περίπου 250–500 ms ανά σύνδεση σε διακομιστή. Κάτω από 100 ms η εκτός σύνδεσης αποκρυπτογράφηση είναι φθηνή· πάνω από 1 s οι χρήστες παραπονούνται πριν βελτιωθεί η ασφάλεια.

Μπορώ να επαληθεύσω κατακερματισμό που παράχθηκε αλλού; Ναι — με επικόλληση του και με δήλωση του υποψήφιου κωδικού. Γνωστές καλές μορφές: PHP password_hash (bcrypt $2y$ και Argon2id), Python passlib, ο hasher argon2 του django, και η μορφή συμβολοσειράς scrypt που χρησιμοποιεί το εργαλείο scrypt του Tarsnap.

Τι κάνει το κουμπί «Σύγκριση»; Κατακερματίζει τον τρέχοντα κωδικό μία φορά με κάθε αλγόριθμο στις προεπιλεγμένες παραμέτρους της σελίδας και αναφέρει τον πραγματικό χρόνο σε αυτό το πρόγραμμα περιήγησης — μια εικόνα των διαφορών κόστους, όχι αυστηρή μέτρηση.