Βέλτιστες πρακτικές για τη δημιουργία ασφαλών κλειδιών API

Όλοι γνωρίζουμε πόσο πολύτιμα είναι τα API. Αποτελούν την πύλη για την εξερεύνηση άλλων υπηρεσιών, την ενσωμάτωσή τους και τη δημιουργία ταχύτερων λύσεων γρηγορότερα.

Ίσως έχετε δημιουργήσει ή σκέφτεστε να δημιουργήσετε API για χρήση από άλλους προγραμματιστές. Ένα API χρειάζεται κάποια μορφή ελέγχου ταυτότητας για να παρέχει εξουσιοδοτημένη πρόσβαση στα δεδομένα που επιστρέφει.

Υπάρχουν πολλά διαθέσιμα πρότυπα ελέγχου ταυτότητας σήμερα, όπως API Keys, OAuth, JWT κ.λπ.

Σε αυτό το άρθρο, θα δούμε πώς να διαχειριζόμαστε σωστά τα κλειδιά API για πρόσβαση στα API.

Γιατί λοιπόν τα κλειδιά API;

Τα κλειδιά API είναι απλά στη χρήση, είναι σύντομα, στατικά και δεν λήγουν εκτός εάν ανακαλούνται. Παρέχουν έναν εύκολο τρόπο επικοινωνίας πολλών υπηρεσιών.

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

Ας ξεκινήσουμε και θα σας δείξω πώς να δημιουργήσετε API Keys με τον σωστό τρόπο.

Δημιουργία κλειδιού API

Δεδομένου ότι το ίδιο το κλειδί API είναι μια ταυτότητα με την οποία μπορεί να προσδιοριστεί η εφαρμογή ή ο χρήστης, πρέπει να είναι μοναδικό, τυχαίο και μη μαντέψιμο. Τα κλειδιά API που δημιουργούνται πρέπει επίσης να χρησιμοποιούν αλφαριθμητικούς και ειδικούς χαρακτήρες. Ένα παράδειγμα τέτοιου κλειδιού API είναι zaCELgL.0imfnc8mVLWwsAawjYr4Rx-Af50DDqtlx.

Ασφαλής αποθήκευση κλειδιών API

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

Σκέψου το. Ο λόγος που πρέπει να αποθηκεύσουμε τα κλειδιά API είναι να βεβαιωθούμε ότι το κλειδί API στο αίτημα είναι έγκυρο και εκδομένο από εμάς (όπως ένας κωδικός πρόσβασης).

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

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

Στον παραπάνω κώδικα, το πρωτεύον κλειδί θα είναι ένας συνδυασμός του προθέματος και του κατακερματισμού του κλειδιού API {prefix}.{hash_of_whole_api_key}.

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

Παρουσίαση του κλειδιού API στους χρήστες

Εφόσον δεν αποθηκεύουμε το αρχικό κλειδί API, μπορούμε να το εμφανίσουμε μόνο μία φορά στον χρήστη, κατά τη στιγμή της δημιουργίας. Γι 'αυτό φροντίστε να ειδοποιήσετε τους χρήστες ότι δεν μπορεί να ανακτηθεί ξανά και πρέπει να δημιουργήσουν ένα νέο διακριτικό εάν ξεχάσουν να αντιγράψουν το κλειδί API και να το αποθηκεύσουν με ασφάλεια. Μπορείτε να κάνετε κάτι τέτοιο:

Πώς οι χρήστες μπορούν να αναγνωρίσουν ένα δημιουργημένο κλειδί API αργότερα

Ένα άλλο πρόβλημα είναι ο τρόπος με τον οποίο οι χρήστες αναγνωρίζουν το σωστό κλειδί API στην κονσόλα σας εάν πρέπει να το επεξεργαστούν ή να το ανακαλέσουν. Αυτό μπορεί να επιλυθεί προσθέτοντας ένα πρόθεμα στο κλειδί API. Παρατηρήστε στην εικόνα πάνω από τους πρώτους 7 χαρακτήρες (αυτό είναι το πρόθεμά μας), διαχωρισμένα με την τελεία.

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

Μην δίνετε στο API Key όλη τη δύναμη

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

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

Για παράδειγμα,

  • εάν χρειάζεστε ένα κλειδί API για να στείλετε email, μπορείτε να δημιουργήσετε ένα κλειδί API με το πεδίο "email.send"
  • Εάν ο τελικός χρήστης έχει πολλούς διακομιστές και ο καθένας εκτελεί μια συγκεκριμένη ενέργεια, τότε μπορεί να δημιουργηθεί ξεχωριστό κλειδί API με συγκεκριμένο πεδίο.

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

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

Περιοριστικά κλειδιά API

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

συμπέρασμα

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

Καλό να εξασφαλίσετε τα API σας!