Στο δεύτερο μέρος του μαθήματος «Δημιουργία τυχαίων κωδικών, συνθηματικών στο τερματικό» θα χρησιμοποιήσουμε μια συσκευή του πυρήνα Linux η οποία παράγει τυχαία δεδομένα αυτόματα και χρησιμοποιείται από αμέτρητα λογισμικά και υπηρεσίες συστήματος.
Εισαγωγή
Στο πρώτο μέρος του μαθήματος, είδαμε μια απλή τεχνική για να παράγουμε «αναλώσιμους» κωδικούς και έμμεσα (ύπουλα θα έλεγαν κάποιοι) φτιάξαμε και ένα προγραμματάκι σε shell scripting για να αυτοματοποιήσουμε την διαδικασία.
Μιας και πλέον είμαστε ζεσταμένοι με όσα κάναμε, μπορούμε να πάμε παραπέρα την όλη υπόθεση και να φτιάξουμε άλλο ένα προγραμματάκι το οποίο όμως θα χρησιμοποιήσει την συσκευή /dev/urandom
Wikipedia: Σε Unix-like λειτουργικά συστήματα, το /dev/random είναι ένα ειδικό αρχείο που χρησιμεύει ως μια γεννήτρια ψευδοτυχαίων αριθμών. Επιτρέπει την πρόσβαση στον περιβάλλοντα (ψηφιακό) «θόρυβο» τα οποία συλλέγονται από τους drivers των συσκευών του υπολογιστή και άλλων πηγών.
Όπως και στο πρώτο άρθρο, όπου ανέφερα έναν γενικό ορισμό του «τώρα», έτσι και εδώ θα κρατήσουμε στο μυαλό μας ότι η συσκευή /dev/urandom μας παρέχει ακανόνιστα και τυχαία αλφαριθμητικά ψηφία και δεν θα μπούμε σε λεπτομέρειες για την «πραγματική τυχαιότητα», την εντροπία αλλά και θέματα ασφάλειας. Η ασφάλεια εδώ είναι το δέντρο… αν εστιάσουμε σε αυτό θα χάνεις το δάσος. Ο σκοπός εδώ είναι απλός :
Αν καταφέρω έστω και έναν από εσάς να τον κάνω να ενδιαφερθεί να μάθει περισσότερα για το τερματικό και το scripting και έπειτα να πάει πέρα από τον απλό καταναλωτισμό εφαρμογών (βλέπε : βρίσκω έτοιμα λογισμικά – και δεν με νοιάζει πως δουλεύει) θα είμαι χαρούμενος.
Τυχαίοι κωδικοί με βάση τo /dev/urandom
Ανοίξτε λοιπόν το τερματικό σας και μπείτε στον προσωρινό φάκελο του συστήματος /tmp και πείτε του να σας προβάλει τα δεδομένα του /dev/urandom με την εντολή cat
cat /dev/urandom
Ο κακός χαμός !
Ωραία τώρα πατήστε Ctrl+C για να σταματήσει η διεργασία.
Μόνο χαρακτήρες που μπορώ να πληκτρολογήσω
Όπως βλέπετε υπάρχουν διάφορα τυχαία και ακανόνιστα σύμβολα από τα οποία, για τους σκοπούς του άρθρου, θα επιλέξουμε να χρησιμοποιήσουμε τα αλφαριθμητικά δεδομένα.
Για να το κάνουμε αυτό θα χρησιμοποιήσουμε την εντολή strings η οποία προβάλει μόνο τους λεγόμενους «εκτυπώσιμους» χαρακτήρες (π.χ. 1234abcd#$%* κλπ).:
strings /dev/urandom
πατήστε Ctrl+C για να σταματήσει η διεργασία.
Τώρα μάλιστα… κάπως καλύτερα.
Μόνο μερικές γραμμές δεδομένων
Ας πάρουμε τώρα τις πρώτες 5 γραμμές δεδομένων όπως το μάθαμε, με την εντολή head και την παράμετρο -n:
strings /dev/urandom | head -n 5 A= Ho m+ed d~h7! 7 N$ X(42
Πολύ … κενό για το τίποτα…
Χμμμ.. ωραία, αλλά εμφανίζονται και τα κενά σε κάποιες περιπτώσεις (λογικό αφού και αυτά είναι χαρακτήρες) …
Δεν πειράζει, ας τα αφαιρέσουμε με την εντολή tr (μεταλλάσσει κάτι σε κάτι άλλο) και την παράμετρο -d (delete) κάθε κενό [:blank:]. Την εντολή αυτή θα την βάλουμε πριν από την εμφάνιση των δεδομένων από τις 5 γραμμές με την head:
strings /dev/urandom | tr -d '[:blank:]' | head -n 5
Ωραία, μέχρι στιγμής τα δεδομένα μας προβάλλονται μόνο από τις 5 πρώτες γραμμές του urandom χωρίς τους κενούς χαρακτήρες. Τώρα ας μαζέψουμε τα δεδομένα σε μια γραμμή πάλι με την εντολή tr και την παράμετρο -d (διαγραφή) από κάθε γραμμή ‘\n’:
strings /dev/urandom | tr -d '[:blank:]' | head -n 5 | tr -d '\n'
Μετατροπή σε πρόγραμμα
Ελάτε τώρα να το κάνουμε πάλι προγραμματάκι όπως στο προηγούμενο άρθρο. Δεν θα επαναλάβω το μάθημα, οπότε αν έχετε απορίες δείτε το προηγούμενο άρθρο.
Έστω λοιπόν ότι θέλουμε να δημιουργήσουμε 5 κωδικούς με χρήση της /dev/urandom. Οπότε ανοίξτε έναν κειμενογράφο και γράψτε τον κώδικα :
#!/usr/bin/env sh for apotelesma in `seq 1 5` do strings /dev/urandom | tr -d '[:blank:]' | head -n 5 | tr -d '\n' echo "" done
Αποθηκεύστε το και μετατρέψτε το σε εκτελέσιμο, μεταφέρετε το στον φάκελο προγραμμάτων και έπειτα τρέξτε το όπως μάθαμε. Στην παρακάτω εικόνα βλέπουμε ένα δείγμα από το προγραμματάκι μας.
Αν θέλουμε να μειώσουμε το μέγεθος των κωδικών (π.χ. 10 χαρακτήρες) μπορούμε να να χρησιμοποιήσουμε πάλι την head με την παράμετρο -c:
strings /dev/urandom | tr -d '[:blank:]' | head -n 5 | tr -d '\n' | head -c 10
Μπορείτε να κατεβάσετε το προγραμματάκι με τον κώδικά από το αποθετήριο λογισμικών του Cerebrux:
Επίλογος
Στο παρόν άρθρο, χρησιμοποιήσαμε μερικές χρήσιμες εντολές :
- string
- /dev/urandom
- tr
- head
- Γράψαμε πάλι το πρόγραμμά μας σε κώδικα Shell Scripting
Θα μπορούσαμε φυσικά να προσθέσουμε και άλλες παραμέτρους η να «μειώσουμε» το μέγεθος της εντολής στον κώδικά μας. Γενικότερα όπως συμβαίνουν σε όλες τις γλώσσες όπως και στο shell scripting, υπάρχουν πολλοί τρόποι για να κάνεις την ίδια δουλειά. Θα ήταν αδύνατο να τις καλύψουμε όλες αλλά και θα ξέφευγε από την ουσία του άρθρου. Μένει να διερευνήσετε όσα είδαμε, με αναζήτηση στο διαδίκτυο.
Αντί να βάλουμε το …
strings /dev/urandom | tr -d ‘[:blank:]’ | head -n 5 | tr -d ‘\n’ | head -c 10
θα μπορούσαμε (με λιγότερες εντολές και σύμφωνα με αυτά που μας έμαθες) …
strings /dev/urandom | tr -d ‘[:space:]’ | head -c 10
Ευχαριστούμε και περιμένουμε και άλλα …. !!! ….
Φυσικά και μπορούμε !
Ήθελα απλώς να δείξω συνδυασμούς με pipe ακόμα και ίδιων εντολών με διαφορετικές παραμέτρους και όλα αυτά να καταλήξουν στο for loop.
Ευχαριστώ πάντως για το tip ! Ευκαιρία είναι να βλέπουν και οι άλλοι διαφορετικούς συνδυασμούς !
Υπαρχει και το pwgen που με καταλληλα ορισματα δινει πολυ ωραιους κωδικους.
Ναι φυσικά ! Υπάρχουν πολλά, όπως π.χ. και apg. Σκοπός φυσικά του άρθρου ήταν να μάθουμε να κατασκευάζουμε και εμείς κάποια πράγματα μόνοι μας και να συνδυάζουμε διαφορετικές εφαρμογές (εντολές) για το επιθυμητό αποτέλεσμα.