Επικοινωνία με την υποστήριξη

Απαντάμε μέσω e-mail, συνήθως μέσα σε δύο ημέρες.

Το Google reCAPTCHA ελέγχει αυτή την υποβολή για κατάχρηση· δεδομένα αποστέλλονται στην Google. Το script φορτώνεται μόνο όταν ανοίξει αυτή η φόρμα.

← Όλα τα άρθρα

Τι κοστίζει ένας κωδικός πρόσβασης σε μέτριο υλικό

Οι σελίδες στατιστικών εδώ μπορούν να προστατευθούν με κωδικό πρόσβασης. Το hashing αυτού του κωδικού είναι η μόνη λειτουργία σε αυτή την υπηρεσία που υποτίθεται ότι είναι αργή — αυτό κάνει την επίθεση σε ένα κλεμμένο hash δαπανηρή. Το ερώτημα είναι πόσο αργή, σε αυτό το υλικό.

Μετρήσεις στο μηχάνημα όπου τρέχει αυτός ο ιστότοπος, με PHP 8:

PASSWORD_DEFAULT560 ms(αντιστοιχεί σε κόστος 12)
κόστος 12595 ms
κόστος 11277 ms
κόστος 10138 ms
κόστος 10138 msκόστος 11277 msκόστος 12595 msPASSWORD_DEFAULT

Η παράμετρος κόστους του bcrypt είναι εκθέτης: κάθε βήμα διπλασιάζει τη δουλειά. Οι μετρήσεις δείχνουν ακριβώς αυτόν τον διπλασιασμό, που είναι καλό σημάδι ότι τίποτα άλλο δεν παρεμβαίνει.

Γιατί η προεπιλογή είναι λάθος επιλογή εδώ

Η PHP αύξησε το προεπιλεγμένο κόστος του bcrypt από 10 σε 12. Σε έναν διακομιστή με υλικό επιτραπέζιου υπολογιστή αυτό είναι λογική αναβάθμιση — πρόκειται για μερικές δεκάδες χιλιοστά του δευτερολέπτου. Σε μέτριο υλικό είναι πάνω από μισό δευτερόλεπτο καθαρού χρόνου CPU, σε ένα μηχάνημα που την ίδια στιγμή σχεδιάζει και εικόνες μετρητών για όλους τους άλλους.

Μισό δευτερόλεπτο ανά σύνδεση είναι κακό από μόνο του. Είναι χειρότερο ως πρόσκληση: οποιοσδήποτε μπορεί να καλέσει το σημείο σύνδεσης, και κάθε κλήση ξοδεύει 560 ms από τη CPU που εξυπηρετεί ολόκληρο τον ιστότοπο. Έτσι η επαλήθευση κωδικού γίνεται η φθηνότερη διαθέσιμη επιφάνεια για επίθεση άρνησης υπηρεσίας.

Γι’ αυτό το κόστος είναι σταθερά ορισμένο στο 10 αντί να αφεθεί στην προεπιλογή. Αυτό είναι σκόπιμα ασθενέστερο από ό,τι επιλέγει πλέον η PHP, και πρέπει να λέγεται ξεκάθαρα αντί να κρύβεται: ένα hash με κόστος 10 είναι τέσσερις φορές φθηνότερο στην επίθεση από ένα hash με κόστος 12. Αυτό που το αντισταθμίζει είναι τι προστατεύει στην πραγματικότητα ο κωδικός — την ορατότητα μιας σελίδας με αριθμούς επισκέψεων, όχι έναν λογαριασμό, όχι χρήματα, όχι ταυτότητα. Δεν υπάρχει τίποτα πίσω του που να μπορεί να καταληφθεί.

Το σημείο που εύκολα διαφεύγει

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

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

Διαφήμιση