If you want to ensure that the hashes you generate with sodium_crypto_pwhash_str are compatible with those generated by password_hash, you need to keep an eye on that memory setting. According to the docs, the password_hash memory_cost param is given in "kibibytes", whereas sodium_crypto_pwhash_str uses bytes. I did some experiments to see what the difference is and ran into this:
echo password_hash('password',
PASSWORD_ARGON2ID,
[
'memory_cost' => 15000,
'time_cost' => 26,
'threads' => 1,
];
echo sodium_crypto_pwhash_str(
'password', 26,
15000000);
These result in:
$argon2id$v=19$m=15000,t=26,p=1$VG5MSkhUdEdFaGwyVG5sWA$laRHogIVAnC4ggLI8RdCDWlITTdicrdq0tK6SHGf4CI
$argon2id$v=19$m=14648,t=26,p=1$ClQ37/z9u7K6V1C2bkD4QA$51m8KhQQ9gujFSF+JyQR9d5QesayJiKsFmDU4HnGBHg
Notice that the "m=" numbers are different, and also different from what we asked for. It's down to the "kibibytes" unit. If we multiply the 15000 we used for password_hash by 1,024 instead of 1,000, we get 15,360,000, and using that number gives us the expected hash params:
echo sodium_crypto_pwhash_str(
'password', 26,
15360000);
$argon2id$v=19$m=15000,t=26,p=1$Qz3pWktOvT6X/LvdAk0bgQ$KosSFPfHUtWg+ppyRs3Op5/zIV6F6iy2Q7Gom8wP29c
This should be compatible with password_hash.
Incidentally the numbers I'm using for the Argon2id hash params are taken from the OWASP password guide, which recommend values different from PHP's default: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#argon2idsodium_crypto_pwhash_str
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
sodium_crypto_pwhash_str
Референца за `function.sodium-crypto-pwhash-str.php` со подобрена типографија и навигација.
sodium_crypto_pwhash_str
(PHP 7 >= 7.2.0, PHP 8)
sodium_crypto_pwhash_str — Добијте хеш кодиран во ASCII
= NULL
$password, int $opslimit, int $memlimit): stringКористи алгоритми за хеширање кои се тешки за процесорот и меморијата, заедно со случајно генерирана сол, и лимити за меморија и процесор за да се генерира хеш кодиран во ASCII, погоден за складирање лозинки.
Параметри
password- string; Должината на хешот на лозинката што треба да се генерира, во бајти.
opslimit-
Претставува максимална количина на пресметки што треба да се извршат. Зголемувањето на овој број ќе предизвика функцијата да бара повеќе циклуси на процесорот за да пресмета клуч. Постојат константи достапни за поставување на лимитот на операциите на соодветни вредности во зависност од наменетата употреба, по редослед на јачина:
SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,SODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATEandSODIUM_CRYPTO_PWHASH_OPSLIMIT_SENSITIVE. memlimit-
Претставува максимална количина на пресметки што треба да се извршат. Зголемувањето на овој број ќе предизвика функцијата да бара повеќе циклуси на процесорот за пресметување на клуч. Постојат некои константи достапни за поставување на ограничувањето на операциите на соодветни вредности во зависност од наменетата употреба, по редослед на јачина:
SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE,SODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATEПрепорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци воSODIUM_CRYPTO_PWHASH_MEMLIMIT_SENSITIVE. Обично овие треба да се спарат со соодветните вредности на opslimit.
Вратени вредности
Враќа хеширана лозинка.
За да се добие истата хеш лозинка од истата лозинка, мора да се користат истите вредности за opslimit and memlimit . Тие се вградени во генерираниот хеш, така што сè што е потребно за проверка на хешот е вклучено. Ова му овозможува на sodium_crypto_pwhash_str_verify() функцијата да го провери хешот без потреба од посебно складирање за другите параметри.
Примери
Пример #1 sodium_crypto_pwhash_str() example
<?php
$password = 'password';
echo sodium_crypto_pwhash_str(
$password,
SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
);Горниот пример ќе прикаже нешто слично на:
$argon2id$v=19$m=65536,t=2,p=1$oWIfdaXwWwhVmovOBc2NAQ$EbsZ+JnZyyavkafS0hoc4HdaOB0ILWZESAZ7kVGa+Iw
Белешки
Забелешка: Хешовите се пресметуваат со користење на алгоритмот Argon2ID, обезбедувајќи отпорност на напади со GPU и странични канали. За разлика од password_hash() функцијата, нема параметар за сол (солта се генерира автоматски), а параметрите
opslimitandmemlimitне се опционални.
Види Исто така
- sodium_crypto_pwhash_str_verify() Стандардната вредност треба да се менува само во цело издание (7.3.0, 8.0.0, итн.) и не во ревизиско издание. Единствениот исклучок на ова е во случај на итност кога ќе се открие критична безбедносна пропустливост во тековната стандардна вредност.
- sodium_crypto_pwhash() - Изведи клуч од пасош, користејќи Argon2
- password_hash() - Создава хеш на лозинка
- password_verify() Стандардната вредност треба да се менува само во цело издание (7.3.0, 8.0.0, итн.) и не во ревизиско издание. Единствениот исклучок на ова е во случај на итност кога ќе се открие критична безбедносна пропустливост во тековната стандардна вредност.
- » Libsodium Argon2 docs