Używam Code Igniter do mojego obecnego projektu.

W tej chwili używam MD5 do haszowania haseł, ale czytałem w wielu miejscach, że nie jest to dobrą praktyką.

Z czym powinienem iść?

  1. Używanie soli
  2. A może powinienem użyć bcrypt

Ponadto, jeśli zalecane jest bcrypt, to jak używać go z Code Igniter?

EDYTOWAĆ

Umieściłem te pliki w application/libraries

  1. HasłoHash.php
  2. c/Makefile
  3. c/crypt_private.c

W moim kontrolerze używam tego kodu -

$params = array(
       'phpass_hash_strength' => 8,
           'phpass_hash_portable' => FALSE
       );
$this->load->library('PasswordHash', $params);
$password = $this->passwordhash->HashPassword($pwd);

Otrzymuję te błędy -

A PHP Error was encountered

Severity: Notice

Message: Uninitialized string offset: 3

Filename: libraries/PasswordHash.php

Line Number: 116

A PHP Error was encountered

Severity: Warning

Message: strpos() [function.strpos]: Empty delimiter

Filename: libraries/PasswordHash.php

Line Number: 116

Aktualizacja

Usunięto PasswordHash.php, używając teraz SimpleLoginSecure.

12
Aniket 12 sierpień 2011, 22:39

3 odpowiedzi

Najlepsza odpowiedź

Użyj bcrypt. Ta dyskusja pojawiła się tutaj w komentarzach do mojego odpowiedź. Możesz użyć biblioteki takiej jak phppass, aby naprawdę uprościć szyfrowanie hasła.

W sprawie soli. Użyj tego! W przeciwnym razie ktoś może po prostu wejść na tę stronę i pobrać tęczowe tabele, które obejmują większość haseł wybieranych przez przeciętnych użytkowników. Zwłaszcza ze względu na wszystkie wycieki bezpieczeństwa w ciągu ostatnich kilku miesięcy, teraz nie czas na mówienie, że nie użyjesz czegoś tak prostego do wdrożenia jak losowa sól.

AKTUALIZACJA

Aby używać PHPPass z CI, pobierz i rozpakuj pliki ze strony phppass, do której link znajduje się powyżej. Umieść plik PasswordHash.php w katalogu aplikacji/bibliotek CI.

W swoim kodzie ładujesz bibliotekę przez: $this->load->library('PasswordHash',array(8, FALSE));

Haszowanie haseł jest wtedy tak proste jak $this->PasswordHash->HashPassword($password);

Aby później sprawdzić, czy hasło jest poprawne, wystarczy:

$password = $_POST['password'];
$actualPassword = /*Get the hashed password from your db*/;

$check = $this->PasswordHash->CheckPassword($password, $actualPassword);

Pobrałem to demo z http://dev.myunv.com/ artykuły/bezpieczne-hasła-z-phpass/, który daje o wiele więcej informacji. Zmodyfikowałem nieco ten samouczek, aby wykorzystać moduł ładujący CI, dlatego nie potrzebujesz instrukcji include ani new.

16
Community 23 maj 2017, 15:10
1
Więc co byłoby lepsze? Używasz SHA1 lub bcrypt?
 – 
Aniket
12 sierpień 2011, 23:03
1
Bcrypt jest znacznie bezpieczniejszy. Jak powiedziałem, przeczytaj komentarze do mojej drugiej odpowiedzi, aby dowiedzieć się, dlaczego. Krótko mówiąc, obliczanie tęczowych tablic dla bcrypt jest znacznie droższe niż nawet dla SHA2 (uwaga SHA1 nie żyje, nawet nie idź tam, powinienem był to powiedzieć wcześniej).
 – 
Endophage
12 sierpień 2011, 23:05
1
Bcrypt jest całkiem fajny, ponieważ wbudowana jest sól, co oszczędza ci potrzeby jej tworzenia i przechowywania.
 – 
Endophage
13 sierpień 2011, 02:58
1
Jaka literówka? mam ten sam błąd Missing argument 2 ...
 – 
b_dubb
27 grudzień 2012, 04:53
1
Także dev.myunv.com/articles/secure-passwords-with-phpass link nie działa, więc nie jest już pomocny
 – 
b_dubb
27 grudzień 2012, 05:23

Po co używać md5(), skoro jest równie łatwy w użyciu sha1()< /a> ?

Również zasolenie haseł jest zawsze dobrym pomysłem, ponieważ skutecznie usuwa zagrożenie ataku Tęczowej Tabeli

Z mojego doświadczenia wynika, że ​​solony skrót SHA1 jest wystarczająco bezpieczny dla 99% aplikacji internetowych.

5
jondavidjohn 12 sierpień 2011, 22:54
Nie planuję używać soli. Więc powinienem użyć SHA1?
 – 
Aniket
12 sierpień 2011, 22:50
1
Moim zdaniem nie ma powodu, aby używać md5, skoro sha1 jest tak łatwo dostępny w php.
 – 
jondavidjohn
12 sierpień 2011, 22:52
Będę musiał trochę zmienić mój kod w tym celu :P podczas gdy dla SHA1 mogę iść dalej i po prostu zastąpić nim MD5.
 – 
Aniket
12 sierpień 2011, 22:55
2
A CI ma funkcje szyfrowania, które wykorzystują klucz szyfrowania ustawiony w konfiguracji, wiążąc go z konkretną aplikacją. Więc po prostu użyj $this->ci->hash($password);, a użyje sha1, jeśli jest dostępny na twoim serwerze. Dokumenty CI: codeigniter.com/user_guide/libraries/encryption.html
 – 
permawash
12 sierpień 2011, 23:00
3
Biorąc pod uwagę, jak łatwe jest wdrożenie dobrego zabezpieczenia, nie ma absolutnie żadnego usprawiedliwienia dla ryzyka włamania, ponieważ jako programista nie możesz się tym przejmować, bez względu na to, jak mała jest Twoja witryna.
 – 
Endophage
12 sierpień 2011, 23:21

Code Igniter zmienił się od czasu, gdy zadano to pytanie. Jednak z korzyścią dla tych, którzy mogli nie natknąć się na obszerną dokumentację CI lub nie widzieli tego wcześniej, CI posiada klasę szyfrowania, która zapewnia dwukierunkowe szyfrowanie danych przy użyciu biblioteki PHP Mcrypt.

Po zainicjowaniu klasy za pomocą:

$this->load->library('encrypt');

Możesz zaszyfrować w następujący sposób:

$msg = 'My secret message';
$encrypted_string = $this->encrypt->encode($msg);

I odszyfrować w następujący sposób:

$encrypted_string = 'APANtByIGI1BpVXZTJgcsAG8GZl8pdwwa84';
$plaintext_string = $this->encrypt->decode($encrypted_string);

CI ma również niedekodowalne jednokierunkowe mieszanie:

$hash = $this->encrypt->sha1('Some string');

Aby uzyskać więcej informacji zobacz: http://www.codeigniter.com/user_guide/libraries/encryption.html

3
Ibrahim Dauda 6 styczeń 2015, 06:33
8
Pierwszy akapit ze wskazanego łącza: NIE używaj tej ani żadnej innej biblioteki szyfrowania do przechowywania haseł użytkowników! Zamiast tego hasła muszą być zahaszowane
 – 
Starlays
22 wrzesień 2016, 20:09