jak zweryfikować poprawność hasza z crypt z algorytmem CRYPT_BLOWFISH

0

W specyfikacji crypt z algorytmem CRYPT_BLOWFISH jest napisane, że pomiędzy:
$2a$09$ a końcowym $

Mają być 22 znaki.
Ale jak robię:

  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalt$');

dostaję hasz:

$2a$09$anexamplestringforsalezVtye4tW4nkAUz6eRz.aJBjfuQ3GzR2

Ostatni znak jest ucięty.

Ostatni znak jest potrzebny do weryfikacji, bo użycie:

anexamplestringforsaltA
anexamplestringforsaltB
anexamplestringforsal

daje różne hasze.

Co więcej, użycie tu tylko 21 znaków działa i skutkuje każdorazowo umieszczeniem kropki pomiędzy solą i zahszowanym hasłem:
$2a$09$fp7bj6iuBA3dHpz5Gkalh.4SIM.pFPnrPFpkqrWouPvkywKaxwIiG
tak jakby tak to miało właśnie wyglądać.

Coś jest skopane w specyfikacji:
https://www.php.net/manual/en/function.crypt.php

CRYPT_BLOWFISH - Blowfish hashing with a salt as follows: "$2a$", "$2x$" or "$2y$", a two digit cost parameter, "$", and 22 characters from the alphabet "./0-9A-Za-z".

czy czegoś nie ogarniam? :/

0

Czytam właśnie, że ten ostatni znak powinien być niby bez znaczenia, ale ma znaczenie :/


  echo("<h2>jedno hasło, hasze 22 - rozne ostatnie litery</h2>");
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalt$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsala$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalb$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalc$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsald$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsale$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalf$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalg$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalh$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsali$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalj$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalk$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsall$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalm$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalm$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalo$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalp$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalr$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsals$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalt$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalu$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalv$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalw$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalx$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsaly$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalz$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalA$');
  echo  "<br>" . crypt("1234567800", '$2a$09$anexamplestringforsalB$');

$2a$09$anexamplestringforsalezVtye4tW4nkAUz6eRz.aJBjfuQ3GzR2
$2a$09$anexamplestringforsalOvVkBlHnPPYpolZ3LvmWj6yRV0PYFSuC
$2a$09$anexamplestringforsalOvVkBlHnPPYpolZ3LvmWj6yRV0PYFSuC
$2a$09$anexamplestringforsalOvVkBlHnPPYpolZ3LvmWj6yRV0PYFSuC
$2a$09$anexamplestringforsalOvVkBlHnPPYpolZ3LvmWj6yRV0PYFSuC
$2a$09$anexamplestringforsalezVtye4tW4nkAUz6eRz.aJBjfuQ3GzR2
$2a$09$anexamplestringforsalezVtye4tW4nkAUz6eRz.aJBjfuQ3GzR2
$2a$09$anexamplestringforsalezVtye4tW4nkAUz6eRz.aJBjfuQ3GzR2
$2a$09$anexamplestringforsalezVtye4tW4nkAUz6eRz.aJBjfuQ3GzR2
$2a$09$anexamplestringforsalezVtye4tW4nkAUz6eRz.aJBjfuQ3GzR2
$2a$09$anexamplestringforsalezVtye4tW4nkAUz6eRz.aJBjfuQ3GzR2
$2a$09$anexamplestringforsalezVtye4tW4nkAUz6eRz.aJBjfuQ3GzR2
$2a$09$anexamplestringforsalezVtye4tW4nkAUz6eRz.aJBjfuQ3GzR2
$2a$09$anexamplestringforsalezVtye4tW4nkAUz6eRz.aJBjfuQ3GzR2
$2a$09$anexamplestringforsalezVtye4tW4nkAUz6eRz.aJBjfuQ3GzR2
$2a$09$anexamplestringforsalezVtye4tW4nkAUz6eRz.aJBjfuQ3GzR2
$2a$09$anexamplestringforsalezVtye4tW4nkAUz6eRz.aJBjfuQ3GzR2
$2a$09$anexamplestringforsalezVtye4tW4nkAUz6eRz.aJBjfuQ3GzR2
$2a$09$anexamplestringforsalezVtye4tW4nkAUz6eRz.aJBjfuQ3GzR2
$2a$09$anexamplestringforsalezVtye4tW4nkAUz6eRz.aJBjfuQ3GzR2
$2a$09$anexamplestringforsaluG8LEWIgWPZ4wuhiiTwJwlKLZ0qiN3mi
$2a$09$anexamplestringforsaluG8LEWIgWPZ4wuhiiTwJwlKLZ0qiN3mi
$2a$09$anexamplestringforsaluG8LEWIgWPZ4wuhiiTwJwlKLZ0qiN3mi
$2a$09$anexamplestringforsaluG8LEWIgWPZ4wuhiiTwJwlKLZ0qiN3mi
$2a$09$anexamplestringforsaluG8LEWIgWPZ4wuhiiTwJwlKLZ0qiN3mi
$2a$09$anexamplestringforsaluG8LEWIgWPZ4wuhiiTwJwlKLZ0qiN3mi
$2a$09$anexamplestringforsal.bFBhFcSaoCG72YZVe/egl3LsxySzjsm
$2a$09$anexamplestringforsal.bFBhFcSaoCG72YZVe/egl3LsxySzjsm

0

Dobra, chyba rozumiem:

This is due to how the salt is encoded. The actual salt is 128 bit but the encoded salt in the crypt format is 22 character · 8 bit/character · 3/4 = 132 bit. So 4 bits of the encoded salt are not actually used.

Czyli chyba wypada po prostu na 22 pozycji umieszczać zawsze taki sam znak. Ale koncepcyjnie to cokolwiek zj... jest :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1