Κρυπτογράφηση σε PHP. Κρυπτογράφηση, αποκρυπτογράφηση δεδομένων χρησιμοποιώντας ένα κλειδί στα κλειδιά κρυπτογράφησης και ελέγχου ταυτότητας PHP

  • Μετάφραση
  • Φροντιστήριο

Από τον μεταφραστή: στη διαδικασία του προγραμματισμού, δεν ξεχνάω ποτέ ότι είμαι επικίνδυνα ανίκανος στην κρυπτογραφία, και συμβουλεύω όλους να προχωρήσουν από αυτήν τη διατριβή (καλά, ίσως εκτός από εσάς και αυτόν τον κουλ τύπο εκεί). Ωστόσο, με τον ένα ή τον άλλο τρόπο, στη διαδικασία της εργασίας προκύπτουν προβλήματα που σχετίζονται με την προστασία δεδομένων και πρέπει να επιλυθούν. Ως εκ τούτου, φέρνω στην προσοχή σας μια μετάφραση ενός άρθρου του Φινλανδού προγραμματιστή Timo H, το οποίο βρήκα αρκετά ενδιαφέρον και χρήσιμο.

Αυτός είναι ένας γρήγορος οδηγός για το πώς να αποφύγετε κοινές παγίδες με τη συμμετρική κρυπτογράφηση στην PHP.

Θα εξετάσουμε την περίπτωση όταν τα δεδομένα υποβάλλονται σε επεξεργασία από την πλευρά του διακομιστή (συγκεκριμένα, πραγματοποιείται κρυπτογράφηση στον διακομιστή και τα δεδομένα μπορούν να ληφθούν, για παράδειγμα, από τον πελάτη με τη μορφή καθαρού κειμένου, κωδικού πρόσβασης κ.λπ.), που είναι μια τυπική περίπτωση για εφαρμογές PHP.

Οι πληροφορίες σε αυτόν τον οδηγό δεν θα πρέπει να χρησιμοποιούνται για τη δημιουργία κρυπτογραφημένων συνδέσεων δικτύου που έχουν πιο πολύπλοκες απαιτήσεις. Για τέτοιες περιπτώσεις, πρέπει να χρησιμοποιήσετε το spied ή το TLS.

Φυσικά, οι συστάσεις που δίνονται εδώ δεν είναι ο «μόνος δυνατός τρόπος» για την οργάνωση της κρυπτογράφησης στην PHP. Ο σκοπός αυτού του οδηγού είναι να προσπαθήσει να αφήσει λιγότερο χώρο για λάθη και δύσκολες, διφορούμενες αποφάσεις.

Λειτουργίες κρυπτογράφησης σε PHP

Χρησιμοποιήστε επεκτάσεις Mcrypt ή OpenSSL.

Αλγόριθμος κρυπτογράφησης και τρόπος λειτουργίας του, κωδικός μιας χρήσης (διάνυσμα αρχικοποίησης)

Χρησιμοποιήστε το AES-256 σε λειτουργία CTR με έναν τυχαίο κωδικό μιας χρήσης ( περίπου. μετάφραση: nonce). Το AES είναι ένα πρότυπο, επομένως μπορείτε να χρησιμοποιήσετε τις λειτουργίες οποιασδήποτε από τις επεκτάσεις - Mcrypt ή OpenSSL.

Να δημιουργείτε πάντα έναν νέο κωδικό μιας χρήσης. Σε αυτήν την περίπτωση, πρέπει να χρησιμοποιήσετε μια κρυπτογραφικά ασφαλή πηγή τυχαίων αριθμών. Διαβάστε λίγα περισσότερα για τη δημιουργία τυχαίων αριθμών παρακάτω. Ο κωδικός μιας χρήσης δεν είναι μυστικός και μπορεί να συνδεθεί με κρυπτογραφημένο κείμενο για μετάδοση και επακόλουθη αποκρυπτογράφηση.

Ο κωδικός μιας χρήσης πρέπει να έχει μήκος 128 bit (16 byte), μόνο μια συμβολοσειρά byte χωρίς καμία κωδικοποίηση.

Στην επέκταση Mcrypt, το AES είναι γνωστό ως Rijndael-128 ( περίπου. μετάφρ.: παρά το γεγονός ότι μιλάμε για AES-256, αυτό δεν είναι σφάλμα. AES-256 != Rijndael-256). Στο OpenSSL, αντίστοιχα, AES-256-CTR.

Παράδειγμα χρήσης Mcrypt:
Παράδειγμα OpenSSL:
Βεβαιωθείτε ότι η κρυπτογράφηση λειτουργεί σωστά χρησιμοποιώντας δοκιμαστικά διανύσματα ( περίπου. μετάφραση: για το AES-256-CTR δείτε την παράγραφο F.5.5 στη σελίδα 57).

Για τη λειτουργία CTR, υπάρχουν ορισμένοι περιορισμοί στον συνολικό όγκο των κρυπτογραφημένων δεδομένων. Αυτό μπορεί να μην το συναντήσετε στην πράξη, αλλά να έχετε κατά νου ότι δεν πρέπει να κρυπτογραφείτε περισσότερα από 2^64 byte δεδομένων με ένα κλειδί, ανεξάρτητα από το αν είναι ένα μεγάλο μήνυμα ή πολλά σύντομα.

Η λειτουργία CTR παραμένει σταθερή μόνο εάν δεν χρησιμοποιείτε τον ίδιο κωδικό μιας χρήσης με το ίδιο κλειδί. Για το λόγο αυτό, είναι σημαντικό να δημιουργείτε κωδικούς μίας χρήσης χρησιμοποιώντας μια κρυπτογραφικά ισχυρή πηγή τυχαίας. Επιπλέον, αυτό σημαίνει ότι δεν πρέπει να κρυπτογραφείτε περισσότερα από 2^64 μηνύματα με ένα μόνο κλειδί. Δεδομένου ότι το μήκος του κωδικού μίας χρήσης είναι 128 bit, το όριο στον αριθμό των μηνυμάτων (και των αντίστοιχων κωδικών μίας χρήσης) των 2^128/2 είναι σημαντικό λόγω του παραδόξου γενεθλίων ( περίπου. μετάφραση:).

Και να θυμάστε ότι η κρυπτογράφηση δεν θα κρύψει το γεγονός πόσα δεδομένα στέλνετε. Ως παράδειγμα ακραίας περίπτωσης, εάν κρυπτογραφήσετε μηνύματα που περιέχουν μόνο "ναι" ή "όχι", προφανώς η κρυπτογράφηση δεν θα κρύψει αυτές τις πληροφορίες.

Έλεγχος ταυτότητας δεδομένων

Ελέγχετε πάντα την αυθεντικότητα και την ακεραιότητα των δεδομένων.
Για να το κάνετε αυτό, χρησιμοποιήστε το MAC μετά την κρυπτογράφηση. Εκείνοι. Πρώτα τα δεδομένα κρυπτογραφούνται και, στη συνέχεια, λαμβάνεται το HMAC-SHA-256 από το κρυπτογραφημένο κείμενο που προκύπτει, συμπεριλαμβανομένου του ίδιου του κρυπτογραφημένου κειμένου και του κωδικού μιας χρήσης.

Κατά την αποκρυπτογράφηση, ελέγξτε πρώτα το HMAC χρησιμοποιώντας έναν αλγόριθμο σύγκρισης που είναι ανθεκτικός σε επιθέσεις χρονισμού. Μην συγκρίνετε απευθείας $user_submitted_mac και $calculated_mac χρησιμοποιώντας τους τελεστές σύγκρισης == ή ===. Είναι ακόμη καλύτερο να χρησιμοποιήσετε τον "διπλό έλεγχο HMAC".

Εάν ο έλεγχος HMAC είναι επιτυχής, η αποκρυπτογράφηση μπορεί να πραγματοποιηθεί με ασφάλεια. Εάν το HMAC δεν είναι κατάλληλο, κλείστε αμέσως τη λειτουργία.

Κλειδιά κρυπτογράφησης και ελέγχου ταυτότητας

Στην ιδανική περίπτωση, χρησιμοποιήστε κλειδιά που προέρχονται από μια κρυπτογραφικά ισχυρή πηγή τυχαίας. Το AES-256 απαιτεί 32 byte τυχαίων δεδομένων (μια "ακατέργαστη" συμβολοσειρά - μια ακολουθία bit χωρίς χρήση κωδικοποίησης).

Εάν η εφαρμογή εκτελείται με έκδοση PHP κάτω από την 5.5, η οποία δεν έχει ενσωματωμένη υλοποίηση του PBKDF2, τότε θα πρέπει να χρησιμοποιήσετε τη δική σας υλοποίηση στην PHP, ένα παράδειγμα της οποίας μπορείτε να βρείτε εδώ: https://defuse. ca/php-pbkdf2.htm. Λάβετε υπόψη ότι το να βασίζεστε στη δική σας υλοποίηση ενδέχεται να μην επιλύει σωστά το κλειδί όπως κάνει η ενσωματωμένη συνάρτηση hash_pbkdf2().

Μην χρησιμοποιείτε το ίδιο κλειδί για κρυπτογράφηση και έλεγχο ταυτότητας. Όπως αναφέρθηκε παραπάνω, απαιτούνται 32 byte για το κλειδί κρυπτογράφησης και 32 byte για το κλειδί ελέγχου ταυτότητας (HMAC). Με το PBKDF2 μπορείτε να πάρετε 64 byte από τον κωδικό πρόσβασης και να χρησιμοποιήσετε, για παράδειγμα, τα πρώτα 32 byte ως κλειδί κρυπτογράφησης και τα υπόλοιπα 32 byte για το κλειδί ελέγχου ταυτότητας.

Εάν οι κωδικοί πρόσβασής σας είναι αποθηκευμένοι σε ένα αρχείο, για παράδειγμα, ως συμβολοσειρά HEX, μην τους επανακωδικοποιήσετε πριν τους τροφοδοτήσετε στις λειτουργίες κρυπτογράφησης. Αντίθετα, χρησιμοποιήστε το PBKDF2 για να μετατρέψετε κλειδιά με κωδικοποίηση HEX απευθείας σε κλειδί κρυπτογράφησης ή ελέγχου ταυτότητας υψηλής ποιότητας. Ή χρησιμοποιήστε το SHA-256 χωρίς πρόσθετη έξοδο κωδικοποίησης (μόνο μια συμβολοσειρά 32 byte) για να κατακερματίσετε τους κωδικούς πρόσβασης. Η χρήση κανονικού κατακερματισμού κωδικού πρόσβασης παρέχει αρκετή εντροπία. Περισσότερες λεπτομέρειες παρέχονται στις ακόλουθες παραγράφους.

Τέντωμα κλειδιού

Πρώτον, θα πρέπει να αποφύγετε τη χρήση πλήκτρων χαμηλής εντροπίας. Ωστόσο, εάν πρέπει να χρησιμοποιήσετε, για παράδειγμα, κωδικούς πρόσβασης χρήστη, τότε πρέπει οπωσδήποτε να χρησιμοποιήσετε το PBKDF2 με μεγάλο αριθμό επαναλήψεων, προκειμένου να μεγιστοποιήσετε την ασφάλεια του κλειδιού.

Μία από τις παραμέτρους του PBKDF2 είναι ο αριθμός των επαναλήψεων κατακερματισμού. Και όσο υψηλότερο είναι, τόσο μεγαλύτερη είναι η ασφάλεια του κλειδιού στην οποία μπορείτε να βασιστείτε. Εάν ο κώδικάς σας εκτελείται σε μια πλατφόρμα 64-bit, χρησιμοποιήστε τον SHA-512 ως αλγόριθμο κατακερματισμού για το PBKDF2. Για μια πλατφόρμα 32 bit, χρησιμοποιήστε το SHA-256.

Ωστόσο, δεν είναι δυνατό να χρησιμοποιηθεί ένας σχετικά υψηλός αριθμός επαναλήψεων σε διαδικτυακές εφαρμογές λόγω του κινδύνου επίθεσης DoS. Επομένως, η ποιότητα του κλειδιού δεν θα είναι τόσο υψηλή όσο στις εφαρμογές εκτός σύνδεσης, οι οποίες μπορούν να αντέξουν οικονομικά μεγάλο αριθμό επαναλήψεων χωρίς τέτοιο κίνδυνο. Κατά κανόνα, για διαδικτυακές εφαρμογές, επιλέγεται ένας τέτοιος αριθμός επαναλήψεων κατακερματισμού έτσι ώστε το PBKDF2 να μην διαρκεί περισσότερο από 100 ms.

Σε περίπτωση που μπορείτε να χρησιμοποιήσετε κωδικούς πρόσβασης υψηλής εντροπίας, δεν είναι απαραίτητο να το τεντώσετε όπως θα κάνατε για τους κωδικούς πρόσβασης χαμηλής εντροπίας. Για παράδειγμα, εάν δημιουργήσετε ένα "encryption_master_key" και ένα "auth_master_key" χρησιμοποιώντας το /dev/urandom, τότε δεν χρειάζεται καθόλου το PBKDF2. Απλώς βεβαιωθείτε ότι χρησιμοποιείτε τα πλήκτρα ως ακολουθίες bit, χωρίς καμία κωδικοποίηση.

Επιπλέον, με το PBKDF2 δεν είναι δύσκολο να αποκτήσετε τα κλειδιά κρυπτογράφησης και ελέγχου ταυτότητας από έναν μόνο κύριο κωδικό πρόσβασης (απλώς χρησιμοποιήστε έναν μικρό αριθμό επαναλήψεων ή ακόμα και μία). Αυτό είναι χρήσιμο εάν έχετε μόνο έναν "κύριο κωδικό πρόσβασης" που χρησιμοποιείται τόσο για κρυπτογράφηση όσο και για έλεγχο ταυτότητας.

Αποθήκευση και διαχείριση κλειδιών

Το καλύτερο είναι να χρησιμοποιήσετε μια ξεχωριστή αποκλειστική συσκευή αποθήκευσης κλειδιών (HSM).

Εάν αυτό δεν είναι δυνατό, τότε για να περιπλέξει την επίθεση, μπορεί κανείς να χρησιμοποιήσει την κρυπτογράφηση του αρχείου κλειδιού ή του αρχείου διαμόρφωσης (το οποίο αποθηκεύει τα πραγματικά κλειδιά κρυπτογράφησης/επαλήθευσης ταυτότητας) χρησιμοποιώντας ένα κλειδί που είναι αποθηκευμένο σε ξεχωριστή θέση (εκτός του οικιακού καταλόγου ή της ρίζας του ιστότοπου) . Για παράδειγμα, μπορείτε να χρησιμοποιήσετε μια μεταβλητή περιβάλλοντος Apache στο httpd.conf για να αποθηκεύσετε το κλειδί που απαιτείται για την αποκρυπτογράφηση του πραγματικού αρχείου κλειδιών:
SetEnv keyfile_key crypto_strong_high_entropy_key # Μπορείτε να αποκτήσετε πρόσβαση σε αυτήν τη μεταβλητή σε PHP χρησιμοποιώντας $_SERVER["keyfile_key"] # Υπόλοιπο διαμόρφωσης
Τώρα, εάν τα αρχεία στη ρίζα του ιστότοπου και κάτω, συμπεριλαμβανομένων των αρχείων με κλειδιά, παραβιάζονται (για παράδειγμα, εάν διαρρεύσει ένα αντίγραφο ασφαλείας), τα κρυπτογραφημένα δεδομένα θα παραμείνουν ασφαλή επειδή το κλειδί που είναι αποθηκευμένο στη μεταβλητή περιβάλλοντος δεν έχει παραβιαστεί. Είναι σημαντικό να θυμάστε ότι τα αρχεία httpd.conf θα πρέπει να δημιουργούνται ξεχωριστά αντίγραφα ασφαλείας και να μην τίθεται σε κίνδυνο η μεταβλητή keyfile_key μέσω, για παράδειγμα, της εξόδου της phpinfo().

Εάν χρησιμοποιείτε ένα αρχείο αντί για μια παράμετρο διαμόρφωσης, μπορείτε να οργανώσετε την περιστροφή του κλειδιού. Στη χειρότερη περίπτωση, εάν ένας αντίπαλος έχει αποκτήσει τα κλειδιά κρυπτογράφησης και ελέγχου ταυτότητας χωρίς να γίνει αντιληπτός, τότε η περιστροφή των κλειδιών σε ορισμένα διαστήματα μπορεί να περιορίσει την πρόσβασή του (υποθέτοντας ότι δεν μπορεί να αποκτήσει νέα κλειδιά). Αυτή η τεχνική θα βοηθήσει στη μείωση της ζημιάς, επειδή ο εχθρός δεν θα μπορεί να χρησιμοποιήσει επ' αόριστον τα παραβιασμένα κλειδιά.

Συμπίεση δεδομένων

Γενικά, δεν πρέπει να συμπιέσετε το κείμενο προέλευσης πριν το κρυπτογραφήσετε. Αυτό μπορεί να δώσει στον εχθρό ένα πρόσθετο εργαλείο για ανάλυση.

Για παράδειγμα, εάν αποθηκεύετε δεδομένα περιόδου σύνδεσης σε κρυπτογραφημένα cookie, μερικά από τα οποία παρέχονται από τον χρήστη και μερικά από τα οποία αντιπροσωπεύουν μυστικές πληροφορίες, ένας αντίπαλος μπορεί να μάθει πρόσθετες πληροφορίες σχετικά με το μυστικό στέλνοντας, ως απλός χρήστης, ορισμένα ειδικά κατασκευασμένα δεδομένα και μετρώντας πώς αλλάζει το μήκος των κρυπτογραφημένων κειμένων που προκύπτουν.

Το κείμενο συμπιέζεται πιο αποτελεσματικά εάν υπάρχουν επαναλαμβανόμενες περιοχές. Με το χειρισμό των δεδομένων χρήστη, μπορείτε να τα επιλέξετε έτσι ώστε να συμπίπτει εν μέρει με τα μυστικά δεδομένα. Όσο μεγαλύτερη είναι η αντιστοίχιση, τόσο μικρότερο είναι το κρυπτογραφημένο κείμενο εξόδου. Αυτό το είδος επίθεσης ονομάζεται ΕΓΚΛΗΜΑ.

Εάν δεν χρειάζεται να συμπιέσετε τα δεδομένα, μην τα συμπιέσετε.

Περιβάλλον διακομιστή

Κατά γενικό κανόνα, δεν πρέπει να φιλοξενείτε εφαρμογές ευαίσθητες στην ασφάλεια σε κοινόχρηστο διακομιστή. Για παράδειγμα, σε κοινόχρηστη φιλοξενία, όπου ένας αντίπαλος μπορεί να έχει πρόσβαση σε μια εικονική μηχανή στον ίδιο φυσικό διακομιστή με εσάς.

Υπάρχουν διάφοροι λόγοι που κάνουν τους κοινόχρηστους διακομιστές αμφίβολο μέρος για τη φιλοξενία εφαρμογών κρίσιμων για την ασφάλεια. Για παράδειγμα, επιθέσεις μεταξύ εικονικών διακομιστών έχουν πρόσφατα αποδειχθεί: eprint.iacr.org/2014/248.pdf. Αυτή είναι μια καλή υπενθύμιση ότι οι επιθετικές τεχνικές δεν υποβαθμίζονται, αλλά ακονίζονται και βελτιώνονται με την πάροδο του χρόνου. Τέτοιες παγίδες πρέπει πάντα να λαμβάνονται υπόψη.

Διαβούλευση ειδικού

Τελευταίο αλλά εξίσου σημαντικό, συμβουλευτείτε έναν ειδικό για να ελέγξει τον κωδικό ασφαλείας σας.

(PHP 4, PHP 5, PHP 7)

crypt — Κατακερματισμός συμβολοσειρών μονής κατεύθυνσης

Προειδοποίηση

Αυτή η λειτουργία δεν είναι (ακόμη) δυαδική ασφαλής!

Περιγραφή

κρύπτη (συμβολοσειρά $str [, κορδόνι $αλάτι]): χορδή

κρύπτη()θα επιστρέψει μια κατακερματισμένη συμβολοσειρά χρησιμοποιώντας τον τυπικό αλγόριθμο που βασίζεται στο Unix DES ή εναλλακτικούς αλγόριθμους που μπορεί να είναι διαθέσιμοι στο σύστημα.

Η παράμετρος αλάτι είναι προαιρετική. Ωστόσο, κρύπτη()δημιουργεί ένα αδύναμο κατακερματισμό χωρίς το αλάτι. Η PHP 5.6 ή νεότερη έκδοση εμφανίζει ένα σφάλμα E_NOTICE χωρίς αυτό. Βεβαιωθείτε ότι έχετε καθορίσει ένα αρκετά ισχυρό αλάτι για καλύτερη ασφάλεια.

password_hash()χρησιμοποιεί ισχυρό κατακερματισμό, δημιουργεί ισχυρό αλάτι και εφαρμόζει τους κατάλληλους γύρους αυτόματα. password_hash()είναι ένα απλό κρύπτη()περιτύλιγμα και συμβατό με υπάρχοντα κατακερματισμένα κωδικούς πρόσβασης. Χρήση του password_hash()ενθαρρύνεται.

Ορισμένα λειτουργικά συστήματα υποστηρίζουν περισσότερους από έναν τύπους κατακερματισμού. Στην πραγματικότητα, μερικές φορές ο τυπικός αλγόριθμος που βασίζεται στο DES αντικαθίσταται από έναν αλγόριθμο που βασίζεται στο MD5. Ο τύπος κατακερματισμού ενεργοποιείται από το όρισμα salt. Πριν από την έκδοση 5.3, η PHP θα καθόριζε τους διαθέσιμους αλγόριθμους κατά την εγκατάσταση με βάση την crypt(). MD5), ανάλογα με τη διαθεσιμότητα του MD5 crypt().Η PHP ορίζει μια σταθερά με όνομα CRYPT_SALT_LENGTHπου υποδεικνύει το μεγαλύτερο έγκυρο αλάτι που επιτρέπεται από τους διαθέσιμους κατακερματισμούς.

Η τυπική βάση DES κρύπτη()επιστρέφει το αλάτι ως τους δύο πρώτους χαρακτήρες της εξόδου. Χρησιμοποιεί επίσης μόνο τους πρώτους οκτώ χαρακτήρες του str , επομένως οι μεγαλύτερες συμβολοσειρές που ξεκινούν με τους ίδιους οκτώ χαρακτήρες θα παράγουν το ίδιο αποτέλεσμα (όταν χρησιμοποιείται το ίδιο αλάτι).

Σε συστήματα όπου η συνάρτηση crypt() υποστηρίζει πολλούς τύπους κατακερματισμού, οι ακόλουθες σταθερές ορίζονται σε 0 ή 1 ανάλογα με το εάν ο συγκεκριμένος τύπος είναι διαθέσιμος:

  • CRYPT_STD_DES- Τυπικός κατακερματισμός που βασίζεται σε DES με αλάτι δύο χαρακτήρων από το αλφάβητο "./0-9A-Za-z". Η χρήση μη έγκυρων χαρακτήρων στο salt θα προκαλέσει την αποτυχία της crypt().
  • CRYPT_EXT_DES- Εκτεταμένο κατακερματισμό που βασίζεται σε DES. Το "salt" είναι μια συμβολοσειρά 9 χαρακτήρων που αποτελείται από μια υπογράμμιση ακολουθούμενη από 4 byte μέτρησης επαναλήψεων και 4 byte αλάτι. Αυτοί κωδικοποιούνται ως εκτυπώσιμοι χαρακτήρες, 6 bit ανά χαρακτήρα, πρώτα ο λιγότερο σημαντικός χαρακτήρας. Οι τιμές 0 έως 63 κωδικοποιούνται ως "./0-9A-Za-z". Η χρήση μη έγκυρων χαρακτήρων στο salt θα προκαλέσει την αποτυχία της crypt().
  • CRYPT_MD5- Κατακερματισμός MD5 με αλάτι δώδεκα χαρακτήρων που ξεκινά από $1$
  • CRYPT_BLOWFISH- Κατακερματισμός Blowfish με αλάτι ως εξής: "$2a$", "$2x$" ή "$2y$", μια παράμετρος κόστους δύο ψηφίων, "$" και 22 χαρακτήρες από το αλφάβητο "./0-9A- Ζα-ζ». Η χρήση χαρακτήρων εκτός αυτού του εύρους στο salt θα έχει ως αποτέλεσμα η crypt() να επιστρέψει μια συμβολοσειρά μηδενικού μήκους. Η παράμετρος κόστους δύο ψηφίων είναι ο λογάριθμος βάσης-2 του πλήθους επαναλήψεων για τον υποκείμενο αλγόριθμο κατακερματισμού που βασίζεται στο Blowfish και πρέπει να βρίσκεται στην περιοχή 04-31, οι τιμές εκτός αυτού του εύρους θα προκαλέσουν την αποτυχία της crypt(). Οι εκδόσεις της PHP πριν από την 5.3.7 υποστηρίζουν μόνο το "$2a$" ως πρόθεμα salt: Η PHP 5.3.7 εισήγαγε τα νέα προθέματα για να διορθώσει μια αδυναμία ασφαλείας στην υλοποίηση του Blowfish. Ανατρέξτε στο για πλήρεις λεπτομέρειες της επιδιόρθωσης ασφαλείας, αλλά για να συνοψίσουμε, οι προγραμματιστές που στοχεύουν μόνο PHP 5.3.7 και μεταγενέστερες θα πρέπει να χρησιμοποιούν το "$2y$" κατά προτίμηση από το "$2a$".
  • CRYPT_SHA256- Κατακερματισμός SHA-256 με αλάτι δεκαέξι χαρακτήρων με πρόθεμα $5$. Αν η συμβολοσειρά αλατιού ξεκινά με "στρογγυλά=
  • CRYPT_SHA512- Κατακερματισμός SHA-512 με αλάτι δεκαέξι χαρακτήρων με πρόθεμα $6$. Αν η συμβολοσειρά αλατιού ξεκινά με "στρογγυλά= $", η αριθμητική τιμή του N χρησιμοποιείται για να υποδείξει πόσες φορές πρέπει να εκτελεστεί ο βρόχος κατακερματισμού, όπως ακριβώς η παράμετρος κόστους στο Blowfish. Ο προεπιλεγμένος αριθμός γύρων είναι 5000, υπάρχει ελάχιστος αριθμός 1000 και μέγιστος 999.999.999. Οποιαδήποτε επιλογή του N εκτός αυτού του εύρους θα περικοπεί στο πλησιέστερο όριο.

Από την PHP 5.3.0, η PHP περιέχει τη δική της υλοποίηση και θα τη χρησιμοποιήσει εάν το σύστημα δεν υποστηρίζει έναν ή περισσότερους από τους αλγόριθμους.

Παράμετροι

Η συμβολοσειρά που θα κατακερματιστεί.

Προσοχή

Χρησιμοποιώντας την CRYPT_BLOWFISHαλγόριθμος, θα έχει ως αποτέλεσμα την περικοπή της παραμέτρου str σε μέγιστο μήκος 72 χαρακτήρων.

Μια προαιρετική συμβολοσειρά αλατιού για τη βάση του κατακερματισμού. Εάν δεν παρέχεται, η συμπεριφορά ορίζεται από την υλοποίηση του αλγορίθμου και μπορεί να οδηγήσει σε απροσδόκητα αποτελέσματα.

Αξίες επιστροφής

Επιστρέφει την κατακερματισμένη συμβολοσειρά ή μια συμβολοσειρά που είναι μικρότερη από 13 χαρακτήρες και είναι εγγυημένη ότι διαφέρει από το αλάτι σε περίπτωση αποτυχίας.

Προειδοποίηση

Κατά την επικύρωση κωδικών πρόσβασης, μια συνάρτηση σύγκρισης συμβολοσειρών που δεν είναι ευάλωτη σε επιθέσεις χρονισμού θα πρέπει να χρησιμοποιείται για τη σύγκριση της εξόδου του κρύπτη()στον προηγουμένως γνωστό κατακερματισμό. Η PHP 5.6 και μετά παρέχει hash_equals()για το σκοπό αυτό.

Καταγραφή αλλαγών

Εκδοχή Περιγραφή
5.6.5 Όταν η συμβολοσειρά αποτυχίας "*0" δίνεται ως αλάτι , το "*1" θα επιστραφεί τώρα για συνέπεια με άλλες υλοποιήσεις κρυπτογράφησης. Πριν από αυτήν την έκδοση, η PHP 5.6 επέστρεφε εσφαλμένα ένα κατακερματισμό DES.
5.6.0 Αυξήστε την προειδοποίηση ασφαλείας E_NOTICE εάν παραληφθεί το αλάτι.
5.5.21 Όταν η συμβολοσειρά αποτυχίας "*0" δίνεται ως αλάτι , το "*1" θα επιστραφεί τώρα για συνέπεια με άλλες υλοποιήσεις κρυπτογράφησης. Πριν από αυτήν την έκδοση, η PHP 5.5 (και οι παλαιότεροι κλάδοι) επέστρεφαν εσφαλμένα έναν κατακερματισμό DES.
5.3.7 Προστέθηκε $2x$και $2 ε$Λειτουργίες Blowfish για την αντιμετώπιση πιθανών επιθέσεων υψηλού bit.
5.3.2 Προστέθηκαν κρύπτες SHA-256 και SHA-512 βασισμένες στην υλοποίηση του Ulrich Drepper.
5.3.2 Διορθώθηκε η συμπεριφορά Blowfish σε μη έγκυρους γύρους για να επιστρέψει η συμβολοσειρά "αποτυχίας" ("*0" ή "*1"), αντί να επιστρέψει στο DES.
5.3.0 Η PHP περιέχει τώρα τη δική της υλοποίηση για την κρύπτη MD5, το Standard DES, το Extended DES και τους αλγόριθμους Blowfish και θα το χρησιμοποιήσει εάν το σύστημα δεν υποστηρίζει έναν ή περισσότερους από τους αλγόριθμους.

Παραδείγματα

Παράδειγμα #1 κρύπτη()παραδείγματα

$hashed_password = crypt("mypassword"); // αφήστε το αλάτι να δημιουργηθεί αυτόματα

/* Θα πρέπει να περάσετε ολόκληρα τα αποτελέσματα της crypt() ως το αλάτι για τη σύγκριση του a
κωδικό πρόσβασης, για την αποφυγή προβλημάτων όταν χρησιμοποιούνται διαφορετικοί αλγόριθμοι κατακερματισμού. (Οπως και
λέει παραπάνω, ο τυπικός κατακερματισμός κωδικού πρόσβασης που βασίζεται σε DES χρησιμοποιεί ένα αλάτι 2 χαρακτήρων,
αλλά ο κατακερματισμός που βασίζεται σε MD5 χρησιμοποιεί 12.) */
if (hash_equals ($hashed_password , crypt ($user_input , $hashed_password ))) (
echo "Επαληθεύτηκε ο κωδικός πρόσβασης!" ;
}
?>

Παράδειγμα #2 Χρήση κρύπτη()με htpasswd

// Ορίστε τον κωδικό πρόσβασης
$password = " mypassword " ;

// Λάβετε τον κατακερματισμό, αφήνοντας το αλάτι να δημιουργείται αυτόματα
$hash = crypt($password);
?>

Παράδειγμα #3 Χρήση κρύπτη()με διαφορετικούς τύπους κατακερματισμού

/* Αυτά τα άλατα είναι μόνο παραδείγματα και δεν πρέπει να χρησιμοποιούνται αυτολεξεί στον κώδικά σας.
Θα πρέπει να δημιουργήσετε ένα ξεχωριστό, σωστά διαμορφωμένο salt για κάθε κωδικό πρόσβασης.
*/
εάν (CRYPT_STD_DES == 1 ) (
echo "Standard DES: " . κρύπτη ("rasmuslerdorf", "rl") . "\n" ;
}

εάν (CRYPT_EXT_DES == 1 ) (
echo "Extended DES: " . κρύπτη ("rasmuslerdorf" , "_J9..rasm" ) . "\n" ;
}

εάν (CRYPT_MD5 == 1 ) (
ηχώ "MD5: " . κρύπτη ("rasmuslerdorf" , "$1$rasmusle$" ) . "\n" ;
}

αν (CRYPT_BLOWFISH == 1 ) (
ηχώ "Blowfish: " . crypt("rasmuslerdorf" , "$2a$07$usesomesillystringforsalt$") . "\n" ;
}

εάν (CRYPT_SHA256 == 1 ) (
ηχώ "SHA-256: " . crypt("rasmuslerdorf" , "$5$rounds=5000$usesomesillystringforsalt$") . "\n" ;
}

εάν (CRYPT_SHA512 == 1 ) (
ηχώ "SHA-512: " . crypt("rasmuslerdorf" , "$6$rounds=5000$usesomesillystringforsalt$") . "\n" ;
}
?>

Οποιαδήποτε πληροφορία μπορεί να κρυπτογραφηθεί ή να αποκρυπτογραφηθεί, συμπεριλαμβανομένης της χρήσης PHP. Αυτή η γλώσσα έχει πολλές δυνατότητες κρυπτογράφησης δεδομένων, από απλή έως πολύπλοκη.

Ας δούμε τις βασικές μεθόδους κρυπτογράφησης

βάση64- σας επιτρέπει να κρυπτογραφείτε και να αποκρυπτογραφείτε δεδομένα χρησιμοποιώντας τον αλγόριθμο MIME base64. Δεν χρησιμοποιεί κλειδιά και χρησιμοποιείται συχνά για την απόκρυψη συνδέσμων στην PHP.

Παραδείγματα:
//κρυπτογράφηση του κειμένου
$text = "Σύνδεσμος";
echo base64_encode($text); //Παράγει: PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==
//αποκρυπτογράφηση
echo base64_decode("PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==");
?>

Όπως μπορείτε να δείτε, χρησιμοποιήσαμε αρχικά τη λειτουργία base64_encode και πήραμε τον κρυπτογράφηση: PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==, και στη συνέχεια το αντικατέστησε σε base64_decode και πήρε τον σύνδεσμο πίσω.

md5- σας επιτρέπει να κατακερματίζετε δεδομένα μονομερώς. Δηλαδή, σε αντίθεση με το base64, δεν θα μπορείτε πλέον να τα αποκρυπτογραφήσετε ξανά. Συχνά το md5 χρησιμοποιείται για την αποθήκευση κωδικών πρόσβασης σε μια βάση δεδομένων, αλλά πρόσφατα ο κρυπτογραφημένος συνδυασμός md5 έχει γίνει εύκολο να βρεθεί σε πίνακες αποκρυπτογράφησης, που παρέχονται ευγενικά από πολλούς ιστότοπους και αλγόριθμους. Επομένως, για να αποθηκεύσετε κωδικούς πρόσβασης md5, είναι καλύτερο να αντικαταστήσετε τους αλγόριθμους με το Blowfish.

Παράδειγμα:

//κρυπτογράφηση του κειμένου
echo md5 ("συνδυασμός");
?>

Κρυπτογράφηση κλειδιού

Και το τελευταίο παράδειγμα κρυπτογράφησης/αποκρυπτογράφησης για το οποίο ήθελα να μιλήσω χρησιμοποιεί ένα κλειδί (ως κωδικό πρόσβασης). Δηλαδή, περνάτε ένα μοναδικό κλειδί στη συνάρτηση κρυπτογράφησης και μαζί με αυτό κρυπτογραφείται και ο κώδικας. Για να αποκρυπτογραφήσετε, πρέπει να δώσετε στη συνάρτηση τον κρυπτογραφημένο κωδικό και ένα κλειδί που μόνο εσείς γνωρίζετε. Ένα παράδειγμα χρήσης συναρτήσεων στο κάτω μέρος του κώδικα.

συνάρτηση __encode ($text, $key) (



$enc_text=base64_encode(mcrypt_generic($td,$iv.$text));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
επιστροφή $enc_text; ) )
συνάρτηση strToHex($string) (
$hex="";
για ($i=0; $i< strlen($string); $i++) { $hex .= dechex(ord($string[$i])); }
επιστροφή $hex; )
συνάρτηση __decode($text, $key) (
$td = mcrypt_module_open("tripledes", "", "cfb", "");
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
if (mcrypt_generic_init ($td, $key, $iv) != -1) (
$decode_text = substr(mdecrypt_generic($td, base64_decode($text)),$iv_size);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
επιστροφή $decode_text; ) )
συνάρτηση hexToStr($hex) (
$string="";
για ($i=0; $i< strlen($hex)-1; $i+=2) { $string .= chr(hexdec($hex[$i].$hex[$i+1])); }
επιστροφή $string; )

$str = "Κουλουράκια που πρέπει να κρυπτογραφηθούν!
Με κλειδί";
$code = strToHex(__encode($str, "My#key-do-36-simvolov"));
echo "Κρυπτογραφημένος κώδικας: ".$code."
";

$str = __decode(hexToStr($code), "My#key-do-36-simvolov");
echo "Αποκρυπτογραφημένος κώδικας: ".$str."
";
?>

Μπορείτε να κρυπτογραφήσετε περιεχόμενο html. Το μήκος του κλειδιού δεν πρέπει να υπερβαίνει τους 36 χαρακτήρες.

Αυτή η μέθοδος μπορεί να χρησιμοποιηθεί για την κρυπτογράφηση ορισμένων δεδομένων και την τοποθέτησή τους σε ένα αρχείο ή βάση δεδομένων txt και τη λήψη τους χρησιμοποιώντας αποκρυπτογράφηση με ένα κλειδί.

Φυσικά, οποιοσδήποτε κώδικας μπορεί να αποκρυπτογραφηθεί/χακαριστεί και αυτό δεν αποτελεί εξαίρεση, γι' αυτό χρησιμοποιήστε ισχυρές μεθόδους κρυπτογράφησης.

Μία από τις βασικές αλήθειες της κρυπτογραφίας είναι ότι δεν πρέπει να εφεύρεις τίποτα σε αυτόν τον τομέα εκτός αν είσαι επαγγελματίας. Αυτό είναι εν μέρει αλήθεια, γιατί όλα τα καλύτερα έχουν από καιρό εφευρεθεί, υποφέρει και χρησιμοποιείται εδώ και δεκαετίες στον τομέα της πληροφορικής. Η άλλη πλευρά της αλήθειας είναι ότι η ανάπτυξη ενός συγκεκριμένου πεδίου γνώσης συμβαίνει μόνο με μια συνεχή εισροή φρέσκων ιδεών και πρωτότυπων λύσεων σε αυτό.

Για προφανείς λόγους, δεν θα βάλουμε στο στόχαστρο τους γίγαντες της βιομηχανικής κρυπτογραφίας όπως η AES, αλλά θα βυθιστούμε, ας πούμε, στη δική μας κρυπτογραφική έρευνα με blackjack και χαρά.

Εν μέρει επειδή είναι ενδιαφέρον, εν μέρει επειδή μοντελοποιώντας κάτι δικό σας και συγκρίνοντάς το με αναγνωρισμένα πρότυπα, βλέπετε ξεκάθαρα την αντίθεση, τις αποτελεσματικές λύσεις και τις ξεκάθαρες παραλείψεις και καταλαβαίνετε τι μπορείτε να προσπαθήσετε για να βελτιώσετε την αποτελεσματικότητα.

Αλλά αρκετό νερό ήδη.

Ας υποθέσουμε ότι η web εφαρμογή μας είναι γραμμένη σε PHP, χρειάζεται αναστρέψιμη κρυπτογράφηση και πιστεύουμε ότι μπορούμε να γράψουμε το δικό μας σύστημα κρυπτογράφησης.

Λοιπόν, ας γράψουμε το δικό μας αναστρέψιμο σύστημα κρυπτογράφησης με ιδιωτικά και δημόσια κλειδιά, ένα που θα έχει τα ακόλουθα χαρακτηριστικά ενός περισσότερο ή λιγότερο ασφαλούς κρυπτογραφικού αλγορίθμου:

  1. Η παρουσία συμβόλων θορύβου στον τελικό κρυπτογράφηση.
  2. Οι πληροφορίες σε κάθε κανάλι αποστολέα-προορισμού θα κρυπτογραφούνται χρησιμοποιώντας ένα ιδιωτικό κλειδί και η λειτουργία αντιστοίχισης θα είναι μοναδική για κάθε κλειδί.
  3. Κάθε μήνυμα θα λάβει έναν κωδικό σύνοψης - έναν μοναδικό κωδικό που είναι συνάρτηση του ιδιωτικού κλειδιού και του αρχικού μηνύματος. Αυτό απαιτείται για να επιτευχθεί η μοναδικότητα της συνάρτησης αντιστοίχισης "σύμβολο πηγής".<=>κωδικοποιημένο σύμβολο» όχι μόνο για το κανάλι «Αποστολέας-Δέκτης», αλλά και για κάθε μεμονωμένο μήνυμα.

    Έτσι, ακόμα κι αν φανταστούμε ότι η αντιστοιχία κωδικοποιημένων και πρωτότυπων συμβόλων για ένα συγκεκριμένο μήνυμα έχει γίνει γνωστή μέσω της χρήσης κρυπτογραφικής ανάλυσης, για παράδειγμα, ανάλυσης συχνότητας, αυτό δεν δίνει καμία προτίμηση κατά τη μελέτη ενός άλλου μηνύματος.

  4. Για να περιπλέκουμε την ανάλυση συχνότητας, θα κωδικοποιήσουμε κάθε σύμβολο αρχικού μηνύματος με δύο σύμβολα κρυπτογράφησης.
Λοιπόν τι έγινε.

Στην πραγματικότητα, μπορείτε να δείτε το τελικό αποτέλεσμα

Η κλάση SymCoder περιλαμβάνει μεθόδους κρυπτογράφησης και αποκρυπτογράφησης.

Η κρυπτογράφηση πραγματοποιείται με τη μέθοδο code(), η οποία λαμβάνει το αρχικό μήνυμα ως είσοδο.

Εδώ, ένα μήνυμα από τον παραγόμενο πίνακα αντιστοιχίας στο tab_coded δημιουργεί ένα κρυπτογραφημένο μήνυμα, αραιωμένο κατά μήκος των άκρων και στο εσωτερικό με σύμβολα θορύβου.

Παρεμπιπτόντως, τα σύμβολα θορύβου είναι μοναδικά για κάθε κανάλι αποστολέα-προορισμού, καθώς δημιουργούνται χρησιμοποιώντας το κλειδί καναλιού, αλλά δεν είναι μοναδικά για μηνύματα. Τα σύμβολα που χρησιμοποιούνται για την κρυπτογράφηση στα code_symbols είναι ορισμένα σημεία στίξης και σύμβολα όπως %, @, κ.λπ.

Για κάθε κωδικοποιημένο σύμβολο, υπάρχουν δύο σύμβολα από code_symbols, για προφανείς λόγους ότι είναι αρκετές φορές λιγότερα από τα κωδικοποιημένα σύμβολα.

Ο πίνακας αντιστοιχίας create_tab_coded δημιουργείται χρησιμοποιώντας μια μετάφραση του κατακερματισμού κλειδιού μηνύματος σε έναν πίνακα με τον αριθμό των στοιχείων ίσο με τον αριθμό των στοιχείων στον πίνακα συμβόλων κώδικα. Η αρχική θέση για τη διέλευση κωδικών δύο χαρακτήρων είναι επίσης πάντα διαφορετική και σχετίζεται με το κλειδί καναλιού. Αυτό καθιστά δυνατό να είμαστε βέβαιοι ότι ο αλγόριθμος για τη διέλευση κωδικοποιημένων συμβόλων και την αντιστοίχιση κωδικών συμβόλων με αυτά θα είναι πάντα διαφορετικός (ή είναι εγγυημένο ότι συχνά) είναι διαφορετικός.

Για παράδειγμα, το μήνυμα "hello world", όταν είναι κωδικοποιημένο, μοιάζει με αυτό:

Digest-a00bf11d-&?==&!&?.@.@=!=-.?&1.#&?=:.:.1%!&-%@&@%~&1^#=?%% .!%+.?.~=?..&?%&&:%~.#%@&1&1.#=?.#.?.!&1==&=.-=!

Και εδώ είναι το ίδιο μήνυμα, κωδικοποιημένο ξανά:

Digest-a00bf11d-=:.?=:&!.?.1&-=:=?.?.=.?.!&=%!=-%@=!%~.=^#.1%%. !%+=:.~.@..==%&&1%~.1%@=?.@.!&=.!&@=:&1.==:=!.1&:

Μπορεί να φανεί ότι η σύνοψη του ίδιου μηνύματος είναι η ίδια, αλλά η κρυπτογράφηση γίνεται διαφορετική - τα σύμβολα θορύβου προστίθενται σε αυθαίρετη αντιστοίχιση και με αυθαίρετη σειρά για κάθε νέα κρυπτογράφηση.

Τα μηνύματα έχουν πλεονασμό, ο οποίος μειώνεται όσο αυξάνεται η ένταση του μηνύματος, έως και 10% θόρυβος (για τα συντομότερα μηνύματα, ο θόρυβος φτάνει το 90% ή υψηλότερο τοις εκατό), το ελάχιστο μήκος ενός κρυπτογραφημένου μηνύματος είναι 116 χαρακτήρες. Ένα από τα μειονεκτήματα αυτής της μεθόδου κρυπτογράφησης είναι ότι τα κωδικοποιημένα μηνύματα διπλασιάζονται τουλάχιστον.

Η αποκωδικοποίηση αποτελείται από αντίστροφη μετάφραση της φόρμας "σύμβολο κωδικού" - το αρχικό σύμβολο με το θόρυβο που αποκόπτεται από το μήνυμα. Ποιο θα μπορούσε να είναι το κλειδί; Βασικά, οποιαδήποτε συμβολοσειρά που είναι μοναδική για κάθε ζεύγος προορισμού-δέκτη.

Για παράδειγμα, εάν δημιουργείτε ένα messenger με κρυπτογράφηση μηνυμάτων, τότε η απλούστερη έκδοση του ιδιωτικού κλειδιού θα μπορούσε να είναι md5($user_id_1. $salt. $user_id_2), τότε το κλειδί θα είναι μοναδικό για κάθε κανάλι μηνυμάτων.

Ας υποθέσουμε ότι πρέπει να ανταλλάξετε δεδομένα μεταξύ δύο διακομιστών. Για την προστασία των δεδομένων από την υποκλοπή κίνησης, τα δεδομένα είναι κρυπτογραφημένα. Λοιπόν, για παράδειγμα, η μεταφορά ενεργειών σε ένα botnet. Αυτό είναι που ουσιαστικά δεν είναι κρυπτογράφηση, αλλά ονομάζεται κωδικοποίηση και χρησιμοποιούνται γνωστές λειτουργίες για την αποκωδικοποίηση τέτοιου κώδικα.

Ως άλλο παράδειγμα ψευδο-κρυπτογράφησης, θα δώσω ένα παράδειγμα "κρυπτογράφησης" κωδικών πρόσβασης στη βάση δεδομένων ενός CMS - εκεί οι κωδικοί πρόσβασης δεν είναι κρυπτογραφημένοι σε md5() ή , αλλά απλώς κωδικοποιούνται μέσω του base64. Εκείνοι. Όταν η βάση δεδομένων διαρρεύσει, δεν θα είναι δύσκολο για έναν χάκερ να αποκρυπτογραφήσει όλους τους κωδικούς πρόσβασης χρησιμοποιώντας την ενσωματωμένη συνάρτηση PHP base64_decode().

Πρέπει να μεταδώσουμε δεδομένα χωρίς να ανησυχούμε ότι κάποιος θα μπορέσει να υποκλέψει το κείμενο και να το αποκρυπτογραφήσει. Η PHP διαθέτει ένα δημοφιλές πακέτο κρυπτογράφησης δεδομένων που ονομάζεται Mcrypt, το οποίο παρέχει αμφίδρομη κρυπτογράφηση (δηλαδή την πραγματική κρυπτογράφηση και αποκρυπτογράφηση δεδομένων).

Η έκδοση 2.4.7 του Mcrypt υποστηρίζει τους ακόλουθους συμμετρικούς αλγόριθμους κρυπτογράφησης: Blowfish, RC2, Safer-sk64 xtea, Cast-256, RC4, Safer-sk128, DES, RC4-iv, Serpent, Enigma, Rijndael-128, Threeway, Rijndael-1 , TripleDES, LOKI97, Rijndael-256, Twofish, Panama, Saferplus, κ.λπ. Περισσότερες λεπτομέρειες για κάθε αλγόριθμο είναι γραμμένες στη Wikipedia.

Εφόσον χρησιμοποιείται συμμετρική κρυπτογράφηση, το κλειδί πρέπει να είναι γνωστό και στα δύο μέρη και να παραμένει μυστικό.

Παράδειγμα κρυπτογράφησης και αποκρυπτογράφησης συμβολοσειράς

mcrypt_module_open("des", "", "ecb", "")
Αυτή η συνάρτηση ανοίγει τη μονάδα αλγορίθμου και τη λειτουργία που χρησιμοποιείται. Για αυτό το παράδειγμα, ο αλγόριθμος DES είναι σε λειτουργία ECB.

$key = substr($key, 0, mcrypt_enc_get_key_size($td));
Το μέγιστο μέγεθος κλειδιού πρέπει να ληφθεί καλώντας τη συνάρτηση mcrypt_enc_get_key_size() και οποιαδήποτε τιμή μικρότερη από αυτή θα είναι σωστή.

$s = mcrypt_generic($td, $source);
Κατά την κρυπτογράφηση, τα δεδομένα συμπληρώνονται με μηδέν byte για να διασφαλιστεί ότι τα δεδομένα έχουν μέγεθος n*blocks. Το μέγεθος μπλοκ μεγέθους καθορίζεται από τον αλγόριθμο (για DES το μέγεθος μπλοκ είναι 64 bit). Επομένως, κατά την αποκρυπτογράφηση, το "\0" μπορεί να εμφανιστεί στο τέλος της γραμμής, το οποίο αφαιρείται από τη συνάρτηση trim()