wtorek, 11 sierpnia 2015

[PHP][Bezpieczeństwo] Posolić, czy spieprzyć?

TRUE
1971613062479556600
Hasła można dobrze posolić, albo totalnie sprawę spieprzyć. Prawidłowe posolenie hasła może być dla mało doświadczonej osoby dość niejasne. A czym jest w ogóle to posolenie? Otóż jest to dodanie do hasła jakiegoś ciągu znaków (soli), a następnie dopiero zahaszowanie takiego połączonego ciągu i dopiero zapisanie go w bazie. Co to daje? Otóż daje to to, że nawet po wycieku hashy z bazy nie da się z nimi zbytnio nic zrobić, o ile zostały dobrze posolone i potraktowane dobrym, silnym algorytmem. A dlaczego? Ano dlatego, że nie da rady ich porównać z tablicami, które zawierają listę hashy odpowiadającą wartościom niezahashowanym, tzw. tablicami tęczowymi. Nie znaczy to oczywiście, że nie da się takiego hasła złamać, dobre posolenie tworzy jednak jeden kolejny problem do pokonania, a więc zmniejsza prawdopodobnieństwo dla złamania hasła.


Mały przykład:
Hasło: 12345
Jego hash MD5: 827ccb0eea8a706c4c34a16891f84e7b

Hasło: 12345słoneczkoJestNaDole
(gdzie "słoneczko..." jest solą)
Hash całości: 90a39c12790b33413ae37249ef9b1ac6

Lepiej? Na oko tak, ale nie do końca. Słowa słownikowe wciąż występują i teoretycznie taka sól jest w jakiś sposób możliwa w wystąpieniu.
A co jeśli damy np. taką sól: xGwtdhT537$5#943293-2HF25SDF&^%sh@g?
Tego raczej w słowniku już nie będzie, w połączeniu z naszym hasłem, czyli 12345 da nam to: 12345xGwtdhT537$5#943293-2HF25SDF&^%sh@g, co jako hash da nam:
040b6f4721808f569098ee6dd19e2c8a.

Zaznaczam tutaj jedną ważną sprawę - operujemy jedynie na MD5 i sprawę drugą - takiego hasła w tablicy nie znajdziemy, oraz trzecią - MD5 to dość słaby algorytm.
Pomińmy teraz sprawę drugą i zostawmy jedynie pierwszą i trzecią. Co nam zostaje? Zostaje nam mimo wszystko słaby hash, mimo iż teoretycznie "na oko" niemożliwy do złamania, to jednak możliwy i to jak najbardziej techniką brute-force, która notabene łączy się z tablicami. Kwestia czasu (obecnie dość małego) i mocy obliczeniowej. W dobie płatnych za wynajem chmur obliczeniowych dość krótki czas na złamanie przez podstawianie. Plus dochodzi nam jeszcze jeden aspekt - sprawa kolizji. Matematycznie rzecz biorąc, może zdarzyć się, że dwa różne hasła mogą dać identyczną funkcję skrótu. Dodajmy jeszcze jeden ważny aspekt - każde złamane hasło zostanie dodane do tablicy. Na podstawie ogarniętych haseł można mniej więcej określić, oddzielić część "jawną" hasła od jego soli. Wszystko to jedynie kwestia mocy obliczeniowej.

Jak żyć?

Jak możemy więc zwiększyć bezpieczeństwo (wyobrażając sobie, że pracujemy wciąż na złamanym MD5)? Możemy dokładać do pieca. W jaki sposób?
A czemu sól nie miałaby być generowana dynamicznie? A nie jako stała wartość?
Wyobrażmy sobie teraz taką opcję: użytkownik podczas rejestracji podaje swoje hasło - hashujemy je i dodajemy do bazy. Co stoi na przeszkodzie, żeby do tego hasha nie dodać jeszcze hasha zrobionego z jego emaila połączonego z zahashowanym adesem IP z jakie się rejestrował i zapisaniu tego IP swoim tylko znanym algorytmem szyfrowania, a następnie podczas logowania - użytkownik loguje się, a nasza funkcja odwraca proces? Dodatkowo dodać do tego kilka elementów losowych, zapisanych przy użytkowniku (bo muszą być zapisane, ale niekoniecznie nikt nie musi wiedzieć, które to aspekty). Pole do popisu jest duże. Zaznaczam, że rozmawiamy jedynie o starym MD5, ale tyczy się to też mocniejszych algorytmów.

To tak tytułem eksperymentu - krótki wpis, żeby zobaczyć jakie macie pomysły, bo nic tak nie uczy jak własne podejścia.
Zapraszam do dyskusji, a niebawem obszerniejszy artykuł w tym temacie.

29 komentarzy:

  1. Witaj,

    A co sądzisz o takim połączeniu jak: MD5(SHA1("login+Sól+hasło")) ?

    OdpowiedzUsuń
    Odpowiedzi
    1. MD5 wogole nie powinno byc wykorzystywane do hashowania hasel. W przedstawionym przez Ciebie przykladzie i w lustrzanym (czyli SHA1(MD5(...)) ) istnieje realne ryzyko kolizji. Jeżeli już chcesz łączyć funkcje skrótu żeby w jakiś sposób utrudnić ich odwracanie użyj hash('sha1',hash('sha512','login+Sól+hasło'))

      Usuń
  2. A jak sprawa ma się z bcryptem? Tam sól tworzona jest automatycznie i zapisywana zaraz obok hashowanego ciągu? Czy ten algorytm jest bezpieczny?

    OdpowiedzUsuń
    Odpowiedzi
    1. Podpinam się - a co z bcrypt i password_hash? Czyli ogólnie rzecz ujmując: jak oceniasz bezpieczeństwo standardu MCF? ;)

      Usuń
  3. Trzeba uważać z tym "przesoleniem" , gdyż tak jak mówisz dla mało doświadczonej osoby może być to niezbyt jasne. Tak czy siak fajny wpis ;) Pozdrawiam.

    OdpowiedzUsuń
  4. Dla osoby początkującej to proponowałbym podchodzić do tego "solenia" z pewną dozą ostrożności bo można szybko przedobrzyć. Ciekawy wpis :)

    OdpowiedzUsuń
  5. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń
  6. This site is help full for every person and easily get money through bitcoin atm card . Please visit this site for bitcoin atm card ranking.you can change any money into another currency in any where in the world.

    OdpowiedzUsuń
  7. In order to stay connected to the world around you, mobiles were invented and to use it you need to keep recharging it with balance. The basic concept of top up phone with bitcoin money is quite different from the paper money.

    OdpowiedzUsuń
  8. Here you will find permanent seo solutions to your web project, You can save cost to find more customers online with organic search engine marketing techniques.

    OdpowiedzUsuń


  9. Nice article i was really impressed by seeing this article, it was very interesting to learn PHP and it is very useful for me.Thanks for sharing this wonderful content.its very useful to us.I gained many unknown information, the way you have clearly explained is really fantastic.
    DevOps Training in Chennai

    DevOps Online Training in Chennai

    DevOps Training in Bangalore

    DevOps Training in Hyderabad

    DevOps Training in Coimbatore

    DevOps Training

    DevOps Online Training

    OdpowiedzUsuń
  10. just admiring your work and wondering how you managed this blog so well. It’s so remarkable that I can't afford to not go through this valuable information whenever I surf the internet.keep up!!

    Java training in Chennai

    Java Online training in Chennai

    Java Course in Chennai

    Best JAVA Training Institutes in Chennai

    Java training in Bangalore

    Java training in Hyderabad

    Java Training in Coimbatore

    Java Training

    Java Online Training

    OdpowiedzUsuń
  11. Excellent Blog! I would Thanks for sharing this wonderful content.its very useful to us.
    This is incredible,I feel really happy to have seen your webpage.I gained many unknown information, the way you have clearly explained is really fantastic.keep posting such useful information.


    AWS Course in Chennai

    AWS Course in Bangalore

    AWS Course in Hyderabad

    AWS Course in Coimbatore

    AWS Course

    AWS Certification Course

    AWS Certification Training

    AWS Online Training

    AWS Training


    OdpowiedzUsuń
  12. Very interesting blog.Selenium testing important in IT industry. Many blogs I see these days do not really provide anything that attracts others, but believe me the way you interact is literally awesome..keep up!!

    python training in bangalore

    python training in hyderabad

    python online training

    python training

    python flask training

    python flask online training

    python training in coimbatore


    OdpowiedzUsuń
  13. One of the first steps to become rich overnight you need to do is have a vision and set goals. If your vision is to be independently wealthy within five years, you then have to take that and break it down into smaller time frames and goals, like a goal after one year, then after year two and so on.thanks lot!!

    Android Training in Chennai

    Android Online Training in Chennai

    Android Training in Bangalore

    Android Training in Hyderabad

    Android Training in Coimbatore

    Android Training

    Android Online Training

    OdpowiedzUsuń

  14. Are you looking for the best Azure training in Chennai? Here is the best suggestion for you, Infycle Technologies the best Software training institute in Chennai to study Azure platform with the top demanding courses such as Graphic Design and Animation, Cyber Security, Blockchain, Data Science, Oracle, AWS DevOps, Python, Big data, Python, Selenium Testing, Medical Coding, etc., with best offers. To know more about the offers, approach us on +91-7504633633, +91-7502633633.

    OdpowiedzUsuń

Masz sugestię? Znalazłeś błąd? Napisz komentarz! :)

webmaester.pl - profesjonalne projektowanie WWW i webaplikacji
webmaester.pl - profesjonalne projektowanie WWW i webaplikacji