Μετάβαση στο κύριο περιεχόμενο

Δημιουργώντας ένα password manager με τη Python

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

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

Σε αυτήν την ανάρτηση θα δείξω πώς χρησιμοποίησα την Python για να δημιουργήσω ένα σύστημα διαχείρισης κωδικού πρόσβασης που μου επιτρέπει να χρησιμοποιήσω έναν ενιαίο "κύριο" κωδικό για να δημιουργήσω μοναδικούς κωδικούς πρόσβασης για όλους τους ιστότοπους και τις υπηρεσίες που χρησιμοποιώ.

Hashing, η δική μου λύση 

Συνειδητοποίησα ότι θα μπορούσα να χρησιμοποιήσω μια συνάρτηση κατακερματισμού για να μεταμορφώσω το μοναδικό όνομα μιας υπηρεσίας (όπως το "reddit") και τον κύριο κωδικό μου ("p@ssw0rd") για να δημιουργήσω έναν μοναδικό κωδικό πρόσβασης που δεν θα ήταν ευαίσθητος σε επιθέσεις τύπου λεξικού. Χρησιμοποιώντας την python, αυτό ήταν εξαιρετικά εύκολο.

Η πρώτη έκδοση του προγράμματος που έγραψα ήταν ένα απλό βοηθητικό command-line executable. Συνειδητοποίησα ότι θα χρειαζόμουν κάτι που να βασίζεται στο διαδίκτυο, ώστε να μπορώ να δημιουργήσω κωδικούς πρόσβασης από το τηλέφωνό μου, αλλά για λόγους απλότητας θα περιγράψω απλώς τον βασικό κώδικα τhw Python και θα το αφήσω σε σας για να φτιάξετε μια υπηρεσία διαδικτύου αν σας ενδιαφέρει (θα μπορούσατε να χρησιμοποιήσετε το flask!).

Δημιουργώντας μοναδικούς κωδικούς

Η βιβλιοθήκη hashlib της Python παρέχει υλοποιήσεις αρκετών κρυπτογραφικών λειτουργιών κατακερματισμού, συμπεριλαμβανομένου του SHA-256. 


>>> from hashlib import sha256 
>>> def get_hexdigest(salt, password): 

... return sha256(salt + password).hexdigest() 

Κάπως έτσι μοιάζει η εκτέλεση στο τερματικό μου: 

>>> get_hexdigest('reddit', 'p@ssw0rd') 'afb0e072194a3f4e8ed39290e16bc2f458426714fc308dc28565d6205453eaa5'



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

def get_hexdigest(salt, plaintext): 
 return sha256(salt + plaintext).hexdigest() 

SECRET_KEY = 's3cr3t' def make_password(plaintext, service): 
 salt = get_hexdigest(SECRET_KEY, service)[:20] 
 hsh = get_hexdigest(salt, plaintext) 
 return ''.join((salt, hsh))


Πρόκειται για μια βελτίωση, αλλά εξακολουθούν να υπάρχουν προβλήματα. Δημιουργεί πραγματικά πολύ μεγάλους κωδικούς πρόσβασης που είναι κατασκευασμένοι από '0-9' και 'a-f' πεζά. Επειδή ορισμένες υπηρεσίες απαιτούν ένα μείγμα σημείων και κεφαλαίων, αριθμών ή συμβόλων, πρέπει να μετατρέψουμε αυτό το hex digest σε κάτι κατάλληλο για έναν κωδικό πρόσβασης. Η λύση που καταλήξαμε ήταν να μετατρέψουμε την δεκαεξαδική αναπαράσταση σε έναν αριθμό βάσης-Ν, στη συνέχεια να επεξεργαστούμε τα ψηφία του αριθμού βάσης-Ν ως δείκτες σε ένα αλφάβητο έγκυρων χαρακτήρων. Αυτό το αλφάβητο θα περιέχει όλους τους χαρακτήρες που περιλαμβάνουν έγκυρο κωδικό πρόσβασης και μπορεί να είναι:


  • όλοι οι χαρακτήρες συμβολοσειράς
  • όλα τα ψηφία
  • τα σύμβολα !@#$%^&*()-_ 
Αυτοί οι συνδυασμοί αν αθροιστούν δίνουν ένα σύνολο 74 χαρακτήρων το οποίο μπορεί να αξιοποιηθεί για τη δημιουργία ενός ισχυρού κωδικού.



Οπότε το τελικό αποτέλεσμα όταν ζητάμε να δημιουργηθεί κάποιο password καταλήγει σε:


>>> password('p@ssw0rd', 'reddit') 
    '&7Ulu!UXdj

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

>>> password('p@ssw0rD', 'reddit') 
    '^Zv3a&uxCG' 

>>> password('p@ssw0rd', 'Reddit') 
    '_!p(v0mS*V'

Μετατρέποντας την υπηρεσία σε διαδικτυακή 

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

Αποφάσισα να δημουργήσω ένα web-based interface που μου επιτρέπει να διαχειρίζομαι τον κατάλογο υπηρεσιών και να δημιουργώ κωδικούς πρόσβασης. Εάν το κάνετε αυτό, συστήνω δύο πράγματα:

  • Χρήση SSL στην υπηρεσία 
  • Εμφάνιση του κωδικού ως string για εύκολη αντιγραφή/επικόλληση 

Happy making!


Σχόλια

Δημοφιλείς αναρτήσεις από αυτό το ιστολόγιο

Τα καλύτερα τραγούδια για τις γλώσσες προγραμματισμού

Στο διαδίκτυο κυκλοφορούν δεκάδες χιουμοριστικά βίντεοκλιπ με τραγούδια-παρωδίες που έχουν δημιουργηθεί για να εξυμνήσουν ή να θίξουν τα κακώς κείμενα διάφορων γλωσσών προγραμματισμού. Στην παρακάτω λίστα δείτε ποια θεωρούμε εμείς τα πιο αξιόλογα!  Python  Java  C  Το general ;) 

Ο αδύναμος κρίκος στη κυβερνοασφάλεια είναι το IoT

Για να μιλήσουμε για την ασφάλεια του Internet of Things θα ήταν καλό να δώσουμε μια ταυτότητα σε αυτή την έννοια. Σύφμωνα με τη WIkipedia λοιπόν:  " Το  Διαδίκτυο των πραγμάτων  ή  Ίντερνετ των πραγμάτων  ( αγγλικά :  Internet of things ) αποτελεί το δίκτυο επικοινωνίας πληθώρας συσκευών, οικιακών συσκευών, αυτοκινήτων καθώς και κάθε αντικειμένου που ενσωματώνει ηλεκτρονικά μέσα, λογισμικό, αισθητήρες και συνδεσιμότητα σε δίκτυο ώστε να επιτρέπετε η σύνδεση και η ανταλλαγή δεδομένων."  Ποιος είμαι εγώ λοιπόν για να διαφωνήσω με τη Wikipedia ?  Στα μάτια ενός προγραμματιστή εφαρμογών για το IoT επρόκειται για αυτό το συγκεκριμένο δίκτυο από εκατομύρρια κόμβους οι οποίοι αξιοποιούν τη μια ή την άλλη τεχνολογία για να συλλέξουν δεδομένα σχετικά με διάφρες συνθήκες. Κατόπιν, τα δεδομένα είτε επεξεργάζονται τοπικά και δίνουν αποτέλεσμα , πάντα όμως μοιραζόμενα τη συλλογή στοιχείων με το cloud είτε αποστέλλουν τα δεδομένα στο δεύτερο και περιμένοντας να κάνει αυτό

Γιατί αυτές οι διαφημίσεις της Apple είναι ανεκτίμητης αξίας

Οι διαφημίσεις της Apple είχαν πάντα κάτι το εξωτικό . Είτε αυτό ήταν τα καλογυρισμένα πλάνα από ειδυλιακές τοποθεσίες - βαφτισμένα "Shot on iPhone" - είτε τα πανέμορφα render των συσκευών της.  Όμως, σαν γενιά η οποία έζησε την άνοδο των smartphones από το τίποτα και το πρώτο λειτουργικό σύστημα που χρησιμοποιήσαμε δεν είχε περίεργα aero effects και γλυκά animations θυμόμαστε εκείνες τις διαφημίσεις που μας έκαναν να μισήσουμε ή να αγαπήσουμε την Apple και το Mac . Έτσι δεν είναι;