Ασφάλεια στην αποθήκευση password - Encryption

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
Lykos22
Δημοσιεύσεις: 89
Εγγραφή: 29 Μαρ 2011 16:28
Τοποθεσία: UK

Ασφάλεια στην αποθήκευση password - Encryption

Δημοσίευση από Lykos22 » 01 Απρ 2013 10:57

Εδώ και αρκετό καιρό βρίσκω και διαβάζω αρκετά ξένα άρθρα που εξηγούν πως να αποθηκεύεις με ασφάλεια τους κωδικούς πρόσβασης και σχεδόν σε όλα λένε ότι οι md5() & sha1() (παρόλο που είναι μη-αναστρέψημοι) είναι πλέον ξεπερασμένοι, δεν πρέπει να χρησιμοποιούνται, να μην γίνεται double-hashing κλπ κλπ, φαντάζομαι λίγο-πολύ θα έχετε διαβάσει και εσείς μερικά τέτοια. Επομένως κάτι τέτοιο:

Κώδικας: Επιλογή όλων

$password = md5('my_sercretp@ssword123');
στην πιο απλή περίπτωση, δεν θεωρείται πλέον ασφαλές, ακόμα και αν χρησιμοποιήσω κάποιο salt *.

* Εαν υποθέσουμε ότι έχουμε αυτό:

Κώδικας: Επιλογή όλων

$password= 'my_sercretpassword123';
$salt = 'lorem_ipsumd0l0rs1t@m3tc0ns3ct3tur@d1p1sc1ng3lit';
$password = sha1($password.$hash);
Σε μία ενδεχόμενη επίθεση, αυτό που θα δει ο εισβολέας θα είναι 'my_sercretpassword123lorem_ipsumd0l0rs1t@m3tc0ns3ct3tur@d1p1sc1ng3lit', το οποίο δεν είναι σε καμία περίτπωση το κανονικό password, σωστά? τότε δεν μπορούν να χρησιμοποιηθούν ακόμα αυτοι οι δύο??

Έχω αυτή τη συνάρτηση την οποία χρησιμοποιώ ως εξής:

Κώδικας: Επιλογή όλων

// Περίπτωση 1η: Σε ένα προσωπικό site (project) όπου υπάρχει ένας μόνο χρήστης, ο administrator δηλ. εγώ, έχω το εξής:

$password = $_POST['password']; // password: my_sercretp@ssword123
function do_hash($password){
$salt = "lorem_ipsumd0l0rs1t@m3tc0ns3ct3tur@d1p1sc1ng3lit";
return hash('sha256', $password.$salt); // sha512, whirlpool
}
$hashed_password = do_hash($password);


// Περίπτωση 2η: Σε ένα site με πολλούς χρήστες (blog, eshop κλπ κλπ):

$password = $_POST['password'];
function generate_salt() {
        $salt = uniqid(sha1("lorem_ipsumd0l0rs1t@m3tc0ns3ct3tur@d1p1sc1ng3lit".microtime()));
        $salt = hash('sha256', $salt);// sha512, whirlpool
        return $salt;
}
function do_hash($password,$salt){
   $pepper = "@dd_s0me_m000r3_d@mm1_t3xt";
   return hash('sha256', $password.$salt.$pepper);// sha512, whirlpool
}
$hashed_password = do_hash($password,generate_salt());
Κάτι τέτοιο είναι αρκετά ασφαλές για να αποθηκεύσω τους κωδικούς μου σε κάθε μία από τις περιπτώσεις??

Άβαταρ μέλους
nirvana
Δημοσιεύσεις: 241
Εγγραφή: 01 Σεπ 2005 18:28
Τοποθεσία: Αγ. Παρασκευή

Ασφάλεια στην αποθήκευση password - Encryption

Δημοσίευση από nirvana » 01 Απρ 2013 17:37

Δες και αυτό το topic μήπως σε βοηθήσει.

www.freestuff.gr/forums/viewtopic.php?t=62694

Δεν κανεις το 1 και το 3 απο την λίστα.

Edit: Ειδα ότι κάνεις το 1 στην 2η περίπτωση. Χρειάζεσαι όμως και salt και pepper :p ? Γιατί όχι μόνο ένα unique salt για κάθε χρήστη?

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Ασφάλεια στην αποθήκευση password - Encryption

Δημοσίευση από gvre » 01 Απρ 2013 18:34

Lykos22 έγραψε:Κάτι τέτοιο είναι αρκετά ασφαλές για να αποθηκεύσω τους κωδικούς μου σε κάθε μία από τις περιπτώσεις??
http://phpmaster.com/why-you-should-use ... passwords/
http://codahale.com/how-to-safely-store-a-password/

Άβαταρ μέλους
Lykos22
Δημοσιεύσεις: 89
Εγγραφή: 29 Μαρ 2011 16:28
Τοποθεσία: UK

Ασφάλεια στην αποθήκευση password - Encryption

Δημοσίευση από Lykos22 » 02 Απρ 2013 09:43

@nirvana:
nirvana έγραψε:Edit: Ειδα ότι κάνεις το 1 στην 2η περίπτωση. Χρειάζεσαι όμως και salt και pepper :p ? Γιατί όχι μόνο ένα unique salt για κάθε χρήστη?
Το salt είναι μοναδικό για κάθε χρήστη, αλλά επειδή (συνήθως) και αυτό το αποθηκεύεις στην βάση δεδομένων σου, προσθέτεις και ένα ακόμα pepper το οποίο είναι, όπως παρατηρείς, μέσα στη function και δεν αποθηκεύεται πουθενά. Έτσι ακόμα και το salt να βρεθεί θα σου λείπει πάντα το pepper. Δες το σαν ένα επιπλέον επίπεδο προστασίας :wink:

Από ότι είδα αναφέρεις την crypt(). Προσπάθησα να διαβάσω στο manual για αυτήν, αλλά έχασα τη μπάλα (ειδικά στο Example #3 Using crypt() with different hash types):-?

@gvre: επίσης κάτι που δεν έχω καταλάβει. Το BCrypt είναι ίδιο με την crypt()??:-? Εδώ, στην απάντηση με το tick, λέει :
Υou can use crypt() function to generate bcrypt hashes of input strings. This class can automatically generate salts and verify existing hashes against an input.

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Ασφάλεια στην αποθήκευση password - Encryption

Δημοσίευση από gvre » 02 Απρ 2013 10:30

To bcrypt είναι hashing αλγόριθμος. H crypt μπορεί να χρησιμοποιήσει διάφορους αλγορίθμους για να βγάλει το hash.

Εδώ έχει παράδειγμα και σχόλια για τη χρήση της crypt. Αν έχεις php >= 5.3.7 άλλαξε το $2a$ σε $2y$. Όταν περάσεις σε php 5.5, μπορείς να χρησιμοποιήσεις την password_hash. Αν δε θέλεις να περιμένεις μέχρι τότε υπάρχει και αυτή η library. Δουλεύει όπως η password_hash και δεν θα έχεις πρόβλημα ακόμα και όταν εγκαταστήσεις την php 5.5.

Άβαταρ μέλους
Lykos22
Δημοσιεύσεις: 89
Εγγραφή: 29 Μαρ 2011 16:28
Τοποθεσία: UK

Ασφάλεια στην αποθήκευση password - Encryption

Δημοσίευση από Lykos22 » 02 Απρ 2013 10:58

Δηλαδή στον κώδικά μου που είναι πιο πάνω μπορεί να γίνει έτσι???

Κώδικας: Επιλογή όλων

// Περίπτωση 1η: Σε ένα προσωπικό site (project) όπου υπάρχει ένας μόνο χρήστης, ο administrator δηλ. εγώ, έχω το εξής: 

$password = $_POST['password'];
$salt = "lorem_ipsumd0l0rs1t@m3tc0ns3ct3tur@d1p1sc1ng3lit";
$hashed_password = crypt($password', '$2a$12$' . $salt);

-----------------------

// Περίπτωση 2η: Σε ένα site με πολλούς χρήστες (blog, eshop κλπ κλπ): 

$password = $_POST['password'];
function generate_salt() {
        $salt = uniqid(sha1("lorem_ipsumd0l0rs1t@m3tc0ns3ct3tur@d1p1sc1ng3lit".microtime()));
        $salt = hash('sha256', $salt);// sha512, whirlpool
        return $salt;
} 
$hashed_password = crypt($password', '$2a$12$' . generate_salt());
ή είναι λάθος ή μη αρκετά ασφαλές??

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Ασφάλεια στην αποθήκευση password - Encryption

Δημοσίευση από gvre » 02 Απρ 2013 11:16

Η bcrypt χρειάζεται 22 χαρακτήρες salt, το οποίο θα πρέπει να αποτελείται μόνο από 0-9, a-z και A-Z. Δες εδώ πώς πρέπει να δημιουργείς το salt (το microtime δεν είναι καλό να χρησιμοποιείται για τέτοιες περιπτώσεις).

PanosPss
Δημοσιεύσεις: 78
Εγγραφή: 10 Μάιος 2008 19:53

Ασφάλεια στην αποθήκευση password - Encryption

Δημοσίευση από PanosPss » 14 Απρ 2013 22:05

Γιάτι δεν χρησιμοποιείς την συνάρτηση sha1();

Άβαταρ μέλους
ideal
Δημοσιεύσεις: 302
Εγγραφή: 12 Φεβ 2011 16:26

Ασφάλεια στην αποθήκευση password - Encryption

Δημοσίευση από ideal » 15 Απρ 2013 19:38

ΠΙστευω θα ηταν πολυ χρησιμο αν καποιος ειχε χρονο και μας εφτιαχνε ενα tutorial για το πώς μπορουμε να "καθαριζουμε" τις μεταβλητες που στελνουμε και να ασφαλιζουμε αυτες που αποθηκευουμε σε μια βαση.
Δεν μπορούμε να λύσουμε τα προβλήματά μας χρησιμοποιώντας τον ίδιο τρόπο σκέψης που χρησιμοποιήσαμε όταν τα δημιουργήσαμε. -Α. Einstein

Rent a Car

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ασφάλεια στην αποθήκευση password - Encryption

Δημοσίευση από dva_dev » 15 Απρ 2013 20:07

Δεν ειναι οσο απλο ακουγεται γιατι πρεπει να γινει "καθαρισμα" σε 3 σημεια.
1. κατα την εμφανιση (αναλογως το που εμφανιζουμε το περιεχομενο. στην οθονη σαν html, σαν απλο κειμενο; σε καποια εικονα που τη δημιουργουμε στο runtime; σε καποιο αρχειο pdf, xls, doc ...; )
2. κατα την αποθηκευση στη βαση (ειναι mysql; oracle; mssql; sqlite;...)
3. κατα το input (ειναι εγκυρα για τον τυπο και τη μορφη που θελουμε; ) (κατα προτιμηση πρεπει να γινει και σε client side και σε server side)

Άβαταρ μέλους
ideal
Δημοσιεύσεις: 302
Εγγραφή: 12 Φεβ 2011 16:26

Ασφάλεια στην αποθήκευση password - Encryption

Δημοσίευση από ideal » 16 Απρ 2013 02:24

dva_dev έγραψε:Δεν ειναι οσο απλο ακουγεται γιατι πρεπει να γινει "καθαρισμα" σε 3 σημεια.
1. κατα την εμφανιση (αναλογως το που εμφανιζουμε το περιεχομενο. στην οθονη σαν html, σαν απλο κειμενο; σε καποια εικονα που τη δημιουργουμε στο runtime; σε καποιο αρχειο pdf, xls, doc ...; )
2. κατα την αποθηκευση στη βαση (ειναι mysql; oracle; mssql; sqlite;...)
3. κατα το input (ειναι εγκυρα για τον τυπο και τη μορφη που θελουμε; ) (κατα προτιμηση πρεπει να γινει και σε client side και σε server side)
Σιγουρα δεν ειναι τοσο απλο. Εγω πιο πολυ αναφερομουν σε μεταβλητες που χρησιμοποιουμε μεσα στη σελιδα με PHP POST-GET | SESSIONS | αποθηκευση σε mysql | κωδικους και usernames. Τουλαχιστον τη βασικη ασφαλεια και ισως λιγο πιο προχωρημενες μεθοδους.
Σιγουρα το client-side ειναι απαραιτητο πιο πολυ οπως το κρινω εγω για τη σωστη καθοδηγηση του χρηστη αν και πολλες φορες μπορεις να γλυτωσεις κοπο (δηλαδη αντι να επιστρεψεις πισω απο σελιδα ελεγχου php το κανεις κατευθειαν).
Δεν μπορούμε να λύσουμε τα προβλήματά μας χρησιμοποιώντας τον ίδιο τρόπο σκέψης που χρησιμοποιήσαμε όταν τα δημιουργήσαμε. -Α. Einstein

Rent a Car

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες