rss.png profile for ebal on Stack Exchange, a network of free, community-driven Q&A sites
Sep
09
2015
Create TRUE random passwords - Errata

This blog post is dedicated to “rwman os” for contacting me to suggest that I was wrong !

And indeed I was !! ( <— two exclamation marks)

So this blog post create true random passwords has some mistakes and I am here to make amens.

the correct syntax on creating random passwords is this:


$ cat /dev/urandom | tr -dc $'\x21-\x7E' | head -c 21

and after further investigation (with GNU coreutils 8.23) seems that you can use octal as well:


$ cat /dev/urandom | tr -dc '\041-\176'  | head -c 21
Tag(s): random, password
May
23
2015
Create TRUE random passwords


There is an errata blog post for this one !!!

tldr;


$ cat /dev/urandom  | tr -dc '[\x21-\x7E]' | head -c 16

(Not so) Long Story:

In Linux (we trust) we have a device that create randomness, named: /dev/random

The problem with this device is that the pool entropy (is something useful, believe me) can ran out very quickly.
So instead of random we use urandom. This device takes some output and re-entering it into the pool entropy, so that the entropy pool can never be empty.

Enough with all this tech crap … nobody truly cares …

We want to take some randomness from /dev/urandom … but … the output isnt something useful:


$ cat /dev/urandom  | head

urandom.jpg

so we need to take only the ASCII printable characters from that output.

Looking at the ascii table, we found out that the printable characters starts from:


hexadecimal: 21
to
hexadecimal: 7E

So to get the first n characters we can use the head command.
To get the first 16 characters: head -c 16

To put everything together:


$ cat /dev/urandom  | tr -dc '[\x21-\x7E]' | head -c 16
JY`Fidt:sI>KoElR

$ cat /dev/urandom  | tr -dc '[\x21-\x7E]' | head -c 16
LH[lskwStlgM:

$ cat /dev/urandom  | tr -dc '[\x21-\x7E]' | head -c 16
Eifen5W1F@Vrqsc
Tag(s): random, password
Jun
13
2012
Make Strong Passwords

Πριν από λίγες μέρες αναρτήθηκαν στο διαδίκτυο τα “ανάλατα” hashed συνθηματικά των χρηστών από κάποια δημοφιλή site (linkedin, last.fm, eharmony).

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

Θα προσπαθήσω μέσα από αυτό το άρθρο, μη μιλώντας πολύ τεχνικά, να εξηγήσω κάποια πράγματα και να διορθώσω τις λανθασμένες απόψεις μερικών “ειδικών” που όπως φαίνεται δεν γνωρίζουν από απλά μαθηματικά! Ο σκοπός αυτού του άρθρου είναι καθαρά ενημερωτικός κι όχι εκπαιδευτικός

The Story

Θα ξεκινήσουμε από το τι ακριβώς έγινε.

Τι ειπώθηκε: “Δημοσιεύτηκαν οι κρυπτογραφημένοι κωδικοί”
Τι εν τέλη έγινε και γιατί αυτό που ακούσαμε/διαβάσαμε είναι λάθος.

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

Τα συνθηματικά ΔΕΝ αποθηκεύονται κρυπτογραφημένα, δλδ δεν μπορούν να αποκρυπτογραφηθούν.
Αποθηκεύονται μετασχηματισμένα με βάση κρυπτογραφικών αλγόριθμων.
Οι δύο πιο γνωστοί είναι ο md5 και ο sha1 (και φυσικά οι παραλλαγές τους).
Οι μαθητικοί αλγόριθμοι hash (md5/sha1) έχουν την ιδιότητα ότι για οποιοδήποτε είσοδο (ανεξαρτήτως μέγεθος) παράγουν ένα αποτέλεσμα 32 χαρακτήρων (md5) και 40 χαρακτήρων (sha1) αντίστοιχα.

Από το αποτέλεσμα δεν μπορείς να βρεις την αρχική είσοδο.

Ας κάνουμε ένα παράδειγμα:


$ echo -n test | md5sum 
098f6bcd4621d373cade4e832627b4f6

$ echo -n test | sha1sum
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

Αυτά που κυκλοφόρησαν είναι τα παραπάνω hashed των κωδικών.
Λόγω του περιορισμού των χαρακτήρων (32/40 αντίστοιχα) προκύπτει ότι μπορεί να παραχθεί το ίδιο hash από δύο διαφορετικά συνθηματικά (αδυναμία αλγόριθμου).

Hashes

  • Οπότε αφού δεν αποθηκεύεται clear text το συνθηματικό μου, είμαι ασφαλής;
  • Όχι!

Οι hackers τι κάνουν;

Χρησιμοποιούν λεξικά (όχι μόνο το english.dic αλλά γενικά λεξικά με latin based characters) και με την χρήση των σύγχρονων υπολογιστικών συστημάτων, παράγουν hashes με βάση τα λεξικά. Συγκρίνουν τα hashes με βάση την λέξη εισόδου κι έτσι ανακαλύπτουν τον αρχικό κωδικό. Πλέον αυτά τα προγράμματα έχουν προσαρμοστεί ώστε να παράγουν και τις παραλλαγές των κωδικών αυτών.

Για παράδειγμα, αντικαθιστούν το λατινικό γράμμα l (L) με 1 ή !, ομοίως και το i, κι ούτω καθεξής.
Έτσι για την λέξη: lemon δοκιμάζει και τις παρακάτω παραλλαγές:

lemon
1emon
!emon
l3mon
l#mon
lem0n
lemOn
lem)n

Δυστυχώς δεν έχουμε ακόμα εκπαιδεύσει σωστά τους χρήστες μας, οπότε πιθανά στο site: example.com
τα πιο συνήθη συνθηματικά θα είναι της εξής μορφής:

3x@mpl#

παραλλαγή δλδ του ίδιου domain!

Εμείς θεωρούμε ότι έχουμε ένα δύσκολο (για να θυμόμαστε) κωδικό ενώ αντιθέτως οι hackers έχουν ήδη τον κωδικό στο λεξικό τους! Συγκρίνοντας τα unsalted hashed μπορούν να βρουν τους κωδικούς μας.

Salted Hashes

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

Τα salted hashes είναι τα αλφαριθμητικά που προκύπτουν από την προσθήκη τυχαίων χαρακτήρων στο αρχικό συνθηματικό. Η προσθήκη γίνεται όμως πάντα με τον ίδιο τρόπο (αρχή ή τέλος). Κάθε προγραμματιστής που σέβεται τους χρήστες του, θα πρέπει να ακολουθεί το παραπάνω μηχανισμό. Από την στιγμή που αλλάζει δυναμικά το συνθηματικό, στην βάση αποθηκεύεται πλέον το salted hash κι αυτό δεν έχει καμία σχέση με το αρχικό μας συνθηματικό.

Να το δούμε λίγο πρακτικά με ένα πολύ απλό παράδειγμα.

Εμείς δίνουμε τον κωδικό: test
Προστίθεται το “αλάτι” : “f0c8454f070d1a”

Γίνεται δυναμικά : “test + f0c8454f070d1a”

Τώρα συγκρίνουμε τα hashes:


$ echo -n test | sha256sum -
9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08  -

$ echo -n testf0c8454f070d1a | sha256sum -
fdcbbbbf0081199f46fa0629c0faa06a6a99cf22a5ff63f17b0ebb88e355c6e5  -

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

Security

Άρα είμαστε πλέον ασφαλής.

  • Όχι.

Τα salted hashes μας προστατεύουν μονάχα εάν διαρρεύσει η βάση με τους κωδικούς.
Δεν μας προστατεύει από την αδυναμία του ίδιου μας του κωδικού. Δλδ το πόσο εύκολα μπορεί να βρεθεί.

Όπως φαίνεται οι hackers διαθέτουν (τουλάχιστον) μια βάση με 6 εκατομμύρια unsalted hashed κωδικούς. Κι όλα αυτά μονάχα από ένα site! Είναι αυτονόητο, ότι όσο πιο πολλές βάσεις hack-εύουν τόσο πιο εύκολο γίνεται για αυτούς να “μαντέψουν” το δικό μας αρχικό κωδικό.

  • Τι επίπτωση έχει σε εμάς, εάν διαρρεύσει ο κωδικός από ένα από τα παραπάνω sites;

Εάν έχω τον λογαριασμό ebal σε ένα site με κωδικό test, τότε σε ένα άλλο site θα έχω (πιθανά) test1 ή όνομα χρήστη: ebal1 κι ούτω καθεξής.

Ορίστε πως περίπου είναι οι περισσότεροι χρήστες:

site: username: password
site1: ebal : test
site2: ebal: test1
site3: ebal: test!
site4: Evaggelos: test!
site5: EvaggelosBalaskas: test1!
site6: ebalaskas _at_ ebalaskas _gr_: t3st1!

Με λίγα λόγια, εάν μας “φάνε” τον κωδικό από ένα site, είναι πολύ εύκολο εν δυνάμει να μας “φάνε” τους λογαριασμούς μας κι από τρίτα sites. Αφού έχουν “εκπαιδεύσει” τα προγράμματά τους με τις νέες παραλλαγές κωδικών.

Strong Passwords

Οι άνθρωποι που ασχολούνται επαγγελματικά με το “σπάσιμο” κωδικών, στις μέρες μας είναι εξοπλισμένοι με την τελευταία τεχνολογικά υπολογιστική δύναμη που κάνει την δουλειά τους αρκετά εύκολη. Ενώ πριν μερικά χρόνια ήθελαν μερικούς μήνες, τώρα αρκούν μερικές ώρες. Κατά μέσο όρο, σε περίπου 6 ώρες ένα unsalted md5 hash σπάει, σε λιγότερο από 3 ώρες εάν είναι βασισμένο σε λεξικό, σε λιγότερο από μια ώρα εάν είναι κάτω από 8 χαρακτήρες, σε 15 λεπτά εάν είναι 6 χαρακτήρες. Σε 1 κλάσμα εάν είναι το 123456.

Επίσης με τόσους κωδικούς, μπορούν να παράγουν κι όλες τις δυνατές παραλλαγές. Οπότε το strong>3x@mpl# θέλει περίπου 1.5λεπτό!

Κατ’ εμέ το βασικότερο πρόβλημα στην παραγωγή κωδικών είναι η δημιουργία μικρών αλλά δύσκολων κωδικών.
Εάν πιστεύεται ότι ο κωδικός σας, είναι δύσκολος, έχει γράμματα, έχει κεφαλαία, έχει αριθμούς, έχει σύμβολα και τον θυμάστε δύσκολα, αλλά είναι 8 με 10 χαρακτήρες, τότε κάνετε ένα μεγάλο ΛΑΘΟΣ!

Έχετε δημιουργήσει έναν πολύ δύσκολο κωδικό για ανθρώπους, αλλά έναν πολύ εύκολο για να σπάσει από κάποιο πρόγραμμα!!!

Η πρόταση μου:

Οι κωδικοί πρέπει να είναι αρκετά μεγάλοι (τουλάχιστον 16χαρακτήρες) και να μην βασίζονται σε λεξικά. Εάν θέλω να φτιάξω έναν κωδικό για το email μου τότε το: ” ένας κωδικός για το email μου ” είναι κάτι που μπορώ να θυμάμαι και το αποτέλεσμα με λατινικούς χαρακτήρες είναι το: “enaskwdikosgiatoemailmou” το οποίο θέλει περίπου: 30.11 trillion centuries

Είναι τόσο απλό, οι πολλοί χαρακτήρες αυξάνουν γεωμετρικά την δυσκολία σε ένα κωδικό.
Το “
strong>kWdik0sem@il1” ( παραλλαγή του “κωδικός email 1”) είναι πιο εύκολο να σπάσει από το “enaskwdikosgiatoemailmou” !!!

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

Conclusion

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

ΜΗΝ χρησιμοποιείτε μέρος του site,
ΜΗΝ χρησιμοποιείτε λέξεις από λεξικό,
ΜΗΝ χρησιμοποιείτε λιγότερο από 16 χαρακτήρες

και
ΚΑΛΗ ΤΥΧΗ

ρίξτε μια ματιά στα εξής sites:

Password Haystacks
Strong Password Generator
Password Strength

Tag(s): password