<?php
/**
* A Compatibility library with PHP 5.5's simplified password hashing API.
*
* @author Anthony Ferrara <ircmaxell@php.net>
* @license http://www.opensource.org/licenses/mit-license.html MIT License
* @copyright 2012 The Authors
*/
if (!defined('PASSWORD_BCRYPT')) {
define('PASSWORD_BCRYPT', 1);
define('PASSWORD_DEFAULT', PASSWORD_BCRYPT);
/**
* Hash the password using the specified algorithm
*
* @param string $password The password to hash
* @param int $algo The algorithm to use (Defined by PASSWORD_* constants)
* @param array $options The options for the algorithm to use
*
* @return string|false The hashed password, or false on error.
*/
function password_hash($password, $algo, array $options = array()) {
if (!function_exists('crypt')) {
trigger_error("Crypt must be loaded for password_hash to function", E_USER_WARNING);
return null;
}
if (!is_string($password)) {
trigger_error("password_hash(): Password must be a string", E_USER_WARNING);
return null;
}
if (!is_int($algo)) {
trigger_error("password_hash() expects parameter 2 to be long, " . gettype($algo) . " given", E_USER_WARNING);
return null;
}
$resultLength = 0;
switch ($algo) {
case PASSWORD_BCRYPT:
// Note that this is a C constant, but not exposed to PHP, so we don't define it here.
$cost = 10;
if (isset($options['cost'])) {
$cost = $options['cost'];
if ($cost < 4 || $cost > 31) {
trigger_error(sprintf("password_hash(): Invalid bcrypt cost parameter specified: %d", $cost), E_USER_WARNING);
return null;
}
}
// The length of salt to generate
$raw_salt_len = 16;
// The length required in the final serialization
$required_salt_len = 22;
$hash_format = sprintf("$2y$%02d$", $cost);
// The expected length of the final crypt() output
$resultLength = 60;
break;
default:
trigger_error(sprintf("password_hash(): Unknown password hashing algorithm: %s", $algo), E_USER_WARNING);
return null;
}
$salt_requires_encoding = false;
if (isset($options['salt'])) {
switch (gettype($options['salt'])) {
case 'NULL':
case 'boolean':
case 'integer':
case 'double':
case 'string':
$salt = (string) $options['salt'];
break;
case 'object':
if (method_exists($options['salt'], '__tostring')) {
$salt = (string) $options['salt'];
break;
}
case 'array':
case 'resource':
default:
trigger_error('password_hash(): Non-string salt parameter supplied', E_USER_WARNING);
return null;
}
if (_strlen($salt) < $required_salt_len) {
trigger_error(sprintf("password_hash(): Provided salt is too short: %d expecting %d", _strlen($salt), $required_salt_len), E_USER_WARNING);
return null;
} elseif (0 == preg_match('#^[a-zA-Z0-9./]+$#D', $salt)) {
$salt_requires_encoding = true;
}
} else {
$buffer = '';
$buffer_valid = false;
if (function_exists('mcrypt_create_iv') && !defined('PHALANGER')) {
$buffer = mcrypt_create_iv($raw_salt_len, MCRYPT_DEV_URANDOM);
if ($buffer) {
$buffer_valid = true;
}
}
if (!$buffer_valid && function_exists('openssl_random_pseudo_bytes')) {
$buffer = openssl_random_pseudo_bytes($raw_salt_len);
if ($buffer) {
$buffer_valid = true;
}
}
if (!$buffer_valid && @is_readable('/dev/urandom')) {
$f = fopen('/dev/urandom', 'r');
$read = _strlen($buffer);
while ($read < $raw_salt_len) {
$buffer .= fread($f, $raw_salt_len - $read);
$read = _strlen($buffer);
}
fclose($f);
if ($read >= $raw_salt_len) {
$buffer_valid = true;
}
}
if (!$buffer_valid || _strlen($buffer) < $raw_salt_len) {
$bl = _strlen($buffer);
for ($i = 0; $i < $raw_salt_len; $i++) {
if ($i < $bl) {
$buffer[$i] = $buffer[$i] ^ chr(mt_rand(0, 255));
} else {
$buffer .= chr(mt_rand(0, 255));
}
}
}
$salt = $buffer;
$salt_requires_encoding = true;
}
if ($salt_requires_encoding) {
// encode string with the Base64 variant used by crypt
$base64_digits =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
$bcrypt64_digits =
'./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$base64_string = base64_encode($salt);
$salt = strtr(rtrim($base64_string, '='), $base64_digits, $bcrypt64_digits);
}
$salt = _substr($salt, 0, $required_salt_len);
$hash = $hash_format . $salt;
$ret = crypt($password, $hash);
if (!is_string($ret) || _strlen($ret) != $resultLength) {
return false;
}
return $ret;
}
/**
* Get information about the password hash. Returns an array of the information
* that was used to generate the password hash.
*
* array(
* 'algo' => 1,
* 'algoName' => 'bcrypt',
* 'options' => array(
* 'cost' => 10,
* ),
* )
*
* @param string $hash The password hash to extract info from
*
* @return array The array of information about the hash.
*/
function password_get_info($hash) {
$return = array(
'algo' => 0,
'algoName' => 'unknown',
'options' => array(),
);
if (_substr($hash, 0, 4) == '$2y$' && _strlen($hash) == 60) {
$return['algo'] = PASSWORD_BCRYPT;
$return['algoName'] = 'bcrypt';
list($cost) = sscanf($hash, "$2y$%d$");
$return['options']['cost'] = $cost;
}
return $return;
}
/**
* Determine if the password hash needs to be rehashed according to the options provided
*
* If the answer is true, after validating the password using password_verify, rehash it.
*
* @param string $hash The hash to test
* @param int $algo The algorithm used for new password hashes
* @param array $options The options array passed to password_hash
*
* @return boolean True if the password needs to be rehashed.
*/
function password_needs_rehash($hash, $algo, array $options = array()) {
$info = password_get_info($hash);
if ($info['algo'] != $algo) {
return true;
}
switch ($algo) {
case PASSWORD_BCRYPT:
$cost = isset($options['cost']) ? $options['cost'] : 10;
if ($cost != $info['options']['cost']) {
return true;
}
break;
}
return false;
}
/**
* Verify a password against a hash using a timing attack resistant approach
*
* @param string $password The password to verify
* @param string $hash The hash to verify against
*
* @return boolean If the password matches the hash
*/
function password_verify($password, $hash) {
if (!function_exists('crypt')) {
trigger_error("Crypt must be loaded for password_verify to function", E_USER_WARNING);
return false;
}
$ret = crypt($password, $hash);
if (!is_string($ret) || _strlen($ret) != _strlen($hash) || _strlen($ret) <= 13) {
return false;
}
$status = 0;
for ($i = 0; $i < _strlen($ret); $i++) {
$status |= (ord($ret[$i]) ^ ord($hash[$i]));
}
return $status === 0;
}
function _strlen($binary_string) {
if (function_exists('mb_strlen')) {
return mb_strlen($binary_string, '8bit');
}
return strlen($binary_string);
}
function _substr($binary_string, $start, $length) {
if (function_exists('mb_substr')) {
return mb_substr($binary_string, $start, $length, '8bit');
}
return substr($binary_string, $start, $length);
}
}
echo password_hash('hola',PASSWORD_BCRYPT);
- Output for 7.2.0
- $2y$10$ybUq5xaueRU4g6iPMVLzxOUyjXIXt.QuLNJo2YZH1iK/N.vnpu/GG
- Output for 7.1.7
- $2y$10$V92YTIJ2o.c9rf/NYX073O7tEMfiXtRdzKClvnXf0jldXlUC8QAY.
- Output for 7.1.6
- $2y$10$sHuBAL3VotOxg44w/B1jKuhNiRIeegpBrYsi0/j5RTT7g77IGbKTC
- Output for 7.1.5
- $2y$10$J.MpZN6UeL8YHS0dwqMm6OdZaozvMz9Qgfk/nsDkDnpIcI7idZObq
- Output for 7.1.0
- $2y$10$oV1f0VsPy1ogr.PTeajeLuqmr.3AeDZhfqsJAL7V2aSSYdoz3bBZm
- Output for 7.0.20
- $2y$10$MJktbGWUPZ0KW0hJBMg6AOI1lEG3gBSL8W4.zTo4fXzGC0NqzR8t6
- Output for 7.0.14
- $2y$10$zfC0R3S72DmliA2zmvT/l.kJM7v4Tc37djYaisa5yZY7NXL8XpNAW
- Output for 7.0.10
- $2y$10$OYtz5BSpvkHiMtm/59.v6OC0JYCQtSTV/zKf.jmjsaAKtV9rubn82
- Output for 7.0.9
- $2y$10$Kfd1LADQQkHIPC24CebGhONSxythZy23509oPO9SgCvwPvwxN8fVu
- Output for 7.0.8
- $2y$10$OD4LM7Jki1dSIiUohhwc7uqA5xdQNkaNsdRDA7S5rzal4x/hGTYvi
- Output for 7.0.7
- $2y$10$crl5H0gTazfKtlR5xBu8dO.VORaM5ycrN0G45xoPcexA3bjCG..we
- Output for 7.0.6
- $2y$10$GkbhDYRtG9eo3rqt.sWfAupqlXzbEHp9sUY3d4jINJghTFaekaEja
- Output for 7.0.5
- $2y$10$zvthchFrPfaZdaRoK9YfeuYKmbN91n41R7Qhm6NZ3FWet6CY9e4.O
- Output for 7.0.4
- $2y$10$csEjqsic7Jlx9PN7DVLDTO2h9XDrcRgCjNLHxxV1mny9Kr95q4tQO
- Output for 7.0.3
- $2y$10$L1l7Wccj63cHzvzaGR1xX.WqkdAQJ06BcLM/SVKD3JI141f42ivOG
- Output for 7.0.2
- $2y$10$pfD3c2oXVNQXMIIRwm5cMuW4PLYHm.fjWfV0XXJ27ijjsrEDeU1UO
- Output for 7.0.1
- $2y$10$23.215/q3o15JzhR.I04UuX5.lRrkZ44DB02/sCju.QTaDs1sfGX6
- Output for 7.0.0
- $2y$10$9X2tPTHL3QJwQTZkerjRfO1b3vOarlSiCgaAWsVVmuSHrFx1vUgBO
- Output for 5.6.28
- $2y$10$3YvN69TjRVSmqF4jTGcyVO9lXLVwGleBAvCct5tSgulhCwAZoPRU2
- Output for 5.6.25
- $2y$10$xRsLWwmZxE1GOo2jkFBzKuBKQ3dLj1/TSjiuf0W92SuM7dlfmgMhy
- Output for 5.6.24
- $2y$10$F3Yzke0uNPg5NpSTfyedOuF8uoPY8zmTkF0YcV8OcbAbAHax/v/Hq
- Output for 5.6.23
- $2y$10$TGk2bf5XV6BcFJs4vPuhWup0/2aZHzUEeScIyK92/yp4dv3Bdp/WC
- Output for 5.6.22
- $2y$10$7EDTZZTtFDVJfXgCvydQC.R45s13uG4zT6yls0qpES/UaAeEnnlKy
- Output for 5.6.21
- $2y$10$0m86TTC0NQSy2yJIY0SJQ.qhEeYaf8skrOa9jUE2qbVxJABus1Z7W
- Output for 5.6.20
- $2y$10$3tILFfkVLOZuBWMN.RsjxummZYF6loIBqZoMPoHk0o.tTDSE0WEre
- Output for 5.6.19
- $2y$10$P3tBfeRvNWnDW097Wg.toOGCJbgG9uIWb8aGsZLao722DonYLnP6C
- Output for 5.6.18
- $2y$10$U9KGoNSevXSTW7RMh1jOQeMAOc.P8TrR2IO21CwFDhKm2IzVQHqLm
- Output for 5.6.17
- $2y$10$vNeJroxzAablYsvn.ubXSeihUnZu8mAYoKkjEG2J7aqlv0t4xZkSG
- Output for 5.6.16
- $2y$10$ETTaU8j2ZWe.yelDOxjO6eVz.o2c.6bmOdYxeVNGLAMGzCx/otmVG
- Output for 5.6.15
- $2y$10$1xj2OIDGrWV555GNn1Fooe2LnXc./5qce5tkjLNRMRhi3NTdV9PSO
- Output for 5.6.14
- $2y$10$kXbRVWsodN7h6IXrEF2Ad.xMogN8/GkDn3zPfyCpFmvaUz7DPCvKa
- Output for 5.6.13
- $2y$10$wXlOr5xwpUtTmUQSCoWbcOQZD3sTfIOQbtLji2GzPBsIswjCxO6nu
- Output for 5.6.12
- $2y$10$WEzijsklvpQEj93LZb2XP.2mMnBTOR9CI3YiWk9vSRNutxxc6ws7e
- Output for 5.6.11
- $2y$10$2BI5Vx85fKU.ZtSUas99y.Pekz8syFtl.jATK/EUaTuyJOIDXTLyu
- Output for 5.6.10
- $2y$10$4Luzs1TOUoX765VnSLndrO9cCj8.95U8UQM6ASehDVhAfUZ.UgqxK
- Output for 5.6.9
- $2y$10$.0TgEzr0oxj6kTW4GubRUOEc7HEKJZjdZVzXfhmD83mf5sfUhICU.
- Output for 5.6.8
- $2y$10$xVXN7KTtyjRBfYMW0V8L2.K3jPaIv.Rpjz/.E6sr90K4x37QbRsYS
- Output for 5.6.7
- $2y$10$lH2xjsZpcDVWFVCbTsco2uKlAkupTcSUl4B9QXj8dWQ4ggXaeR4IS
- Output for 5.6.6
- $2y$10$bbGfSNzSKa4OeA6clwN2P.vx7dsHGdcwO6enkHcQBFj91aF5sJXa2
- Output for 5.6.5
- $2y$10$WAWxw7uZMriL0kq1ray3YecsiQKvb2J0Xqy73PYGhEP4HVUy/Gz3a
- Output for 5.6.4
- $2y$10$JygofOnrQ5fUvTB9gxZaveoy9ckxpiOv2zxi9oEC5n9i62Fglk4T2
- Output for 5.6.3
- $2y$10$PCNQ9WL5Jk/Zulv47HEOGOPaJRCkUdSt24erWLnfgQpPtlnDxXDqC
- Output for 5.6.2
- $2y$10$0TOpKrechYT7s.oavW.lleOrSlkn/H2i9kVL0HowKY7pmh2VfWQDK
- Output for 5.6.1
- $2y$10$9WayDN.GTVtVevY539c9K.MCHK/q4AEbCefWH9IiokIEVal9W1Tmm
- Output for 5.6.0
- $2y$10$MpKDI4EE4eijmc/M1rhpUuCcT4GbByuPz4YrdHdLRat386nRKVR/K
- Output for 5.5.38
- $2y$10$HDX8MaZG2Bv.21dqImrByuyhRp.ySxdR0ita4jGjZJgl/Z.WfXg0u
- Output for 5.5.37
- $2y$10$rkEMfETGam5wyjV.VkmU2O4.YUpOjt3QbKzpYAEpY3Rpv7cqIi8pS
- Output for 5.5.36
- $2y$10$NRK5rFnb84YJ1HYetT8G7O9EJWHVZuGpyhgc5FR6afXMoImwxGhZW
- Output for 5.5.35
- $2y$10$6kw/S7dQ9WedubfgzqZHx.DD.XsEKG7dreDWTovKMnJE9rypc7XmO
- Output for 5.5.34
- $2y$10$PTNhFqmWNuCC2tDKVUK0TePHDxzFW4KH3v2d9eheMQxdyYQS0SFeW
- Output for 5.5.33
- $2y$10$f4l/V6oTDve2sLvv/bbrxOibSHiUfc4C7as4HzD8FuiX1EN/mFWhu
- Output for 5.5.32
- $2y$10$83Vh0Q6.VOj/gileEhq4Q.qI3zn9.cIrzWD4s3niF5GAc8hUEYKk6
- Output for 5.5.31
- $2y$10$aLtwWhkQ4fGGKjHG3a0qzusM611RPKdzVoDt3neh2ZRSSgWADOhwe
- Output for 5.5.30
- $2y$10$o.cK3EKEkcqPbQi/W9o36.4dIzYxgqedSr9sXDhEcPBtloNjTpCou
- Output for 5.5.29
- $2y$10$V9wwGInAIQFqqVrfckwwnOiVJdJSMg8g031Kh8l/H37QsljDeUXke
- Output for 5.5.28
- $2y$10$Mbhf8tW/NyDWRfy5NV8nn.UqZvK4ZQOzpZtN.h43emZhiTgH1puWa
- Output for 5.5.27
- $2y$10$3He8bkSP6SKQLUFQH0.6QehR74GUw/MipSPYK0fX5CG.omU.UpMki
- Output for 5.5.26
- $2y$10$dcASFt308pXBS/y3Gkdho.rOIdLOgNOFUfktjvNd.iosKUFr.MHiy
- Output for 5.5.25
- $2y$10$iUmyLicKu0qXOODGCb8F4OczhCsdY65JcpUwCoZdLpmYltrTm0PO6
- Output for 5.5.24
- $2y$10$9TzcwiQ9VivP7RcJtvNPqunYPPHLML/N3TqZEtHa/RV9li3TAu2mS
- Output for 5.5.23
- $2y$10$n3043nbyv51.Dag9ijRv2uAOK6ZLgnaMLXosNHFA8JTFU5lCZUYti
- Output for 5.5.22
- $2y$10$3QLKmsfjz8kXwAnz2yYc9Om5kZzu9sAOZztGLwxZDgZwT4BG9.4f2
- Output for 5.5.21
- $2y$10$zKGodYdNy2mDbDyXah8kXO24IsUJEZLTKb.gXaj6a747VYs.wcl9y
- Output for 5.5.20
- $2y$10$oW6LN0nXszZwqETeKUd3MerG.4EYiahFAkV1kR3KUbocw8kI4H/ny
- Output for 5.5.19
- $2y$10$JUZFxPrbMQVbf0.MuzORcehmdmZ2yCDdOGHC0NAszE3.eFxyBfzi6
- Output for 5.5.18
- $2y$10$AsVU5mY5UUYcFTw14oFCJ.8.Sus53h.FNstOO8y.0bz0w6fDpclpu
- Output for 5.5.16
- $2y$10$KpRNdq36seHqSRh2v7gmtOu0uNeEujOsQHApF11euD3bCvToY7uv2
- Output for 5.5.15
- $2y$10$HBA6yhzui9V5kUXQJcyDL.aMfhg7Nsc9BMIPW9/iN30XRoxC15pf.
- Output for 5.5.14
- $2y$10$O7OaKcJu9rfmEcn3nd7fPu5xZbBps13CBa7QpsKGTS/3NqRHGABw2
- Output for 5.5.13
- $2y$10$/iQRpaAXPoLpVhIg01GtVenrf9PECkPER4UR.mSSX7abpwt/glI4m
- Output for 5.5.12
- $2y$10$VFIfIOLHlYJTHA1n5Z9sDuDNU7TL2uwCcGGnQ.FmH2GASAxZEsDzi
- Output for 5.5.11
- $2y$10$XERzduXJa25Re.J7s1CI7eM9O/hLTA8l2wVrlVEgWpGpdzbRE9pAC
- Output for 5.5.10
- $2y$10$rTJwDuyfFviGAuhIUIxzgesZlJwqInOFzHqbnG98RcUQoDZckyr/a
- Output for 5.5.9
- $2y$10$MwqBB4RfvNcPwAnqU7DsJet9GUdfC.b9SE3RVucYtt97TFNJVg..m
- Output for 5.5.8
- $2y$10$oi86kaklICO2xt/5fZVEqu98Mjvedq4PG87tFGdszBGVB8lWkbUOO
- Output for 5.5.7
- $2y$10$8W6uFZpmiX8SdkQtm3TFgeOFjTms3Ds4KEBWINZXL93cKFES/XlQq
- Output for 5.5.6
- $2y$10$Hr8nAclHJ4bMEUHp8HGMy.NSWYdGmxZ6IqKuUALbZVTdIngmFWPsO
- Output for 5.5.5
- $2y$10$.fbQIfkuTeNn0YnoxQ2Pyuo/VdY36pWxjdHv.Wvpkl4wtotQqdYVa
- Output for 5.5.4
- $2y$10$KEvlTB.Gahwj9zk9Nqs7fuZKAErkJzcfERgyJcHc7dMXqzSE75Ikm
- Output for 5.5.3
- $2y$10$partmgNrHMuzcPtCJLpeROqi072Mvm0hRyWOdzUKFb1RfH6gMJWRO
- Output for 5.5.2
- $2y$10$XbMLOkbHhLFzSMV0neIrQ.gvxaO5t5yvsdzZxD93UM29.e3GFkVUK
- Output for 5.5.1
- $2y$10$kuAVUz27bHybm7lHImongOB27JNAPAeW3ZLGVPNq5CKBgpmer1ctq
- Output for 5.5.0
- $2y$10$TlEZemWloZkuiniYxP7OhuiqbdP0XYjQgqAFFhDusNgWNuYFoxN3y
- Output for 5.4.45
- $2y$10$XrIywpDOLgZ5KgPzA/NkfuO1wkhPt9KwlvpMTy1zzIeI6COI2I46K
- Output for 5.4.44
- $2y$10$6xU4o6Mhd6UbtzgUg3KJBuS86fKrsaU8qkx1mdgKl2.cU3qmPRPzK
- Output for 5.4.43
- $2y$10$TZfR1Z6v3Sunz6lIf9rUeeKk1I6rQFHfBXc7.Kl2dJFKxaAdv4EqW
- Output for 5.4.42
- $2y$10$448bqd1d0/gc8t9jnx.JmeF29tEqSo/hNV/twBSNHMci7kNxdyRda
- Output for 5.4.41
- $2y$10$lQDX2geJDg7xczreTFBpqOgOlCNnYL3eadD5Uo1JNaCzbNY649qRa
- Output for 5.4.40
- $2y$10$E26xojzemXgsV9FfpJEUKuszHxqRIMsCRfJ2ecdHsIQBzaZSLoOLK
- Output for 5.4.39
- $2y$10$t6PkpTLsC/Y.8F4nltvKYeIIHifX3ak7JCCSQuHWnzZYtECd.zxWG
- Output for 5.4.38
- $2y$10$30qRI/RWa7Psm3FO4zkb0Ooc6yAcGDF7VVPEizldWIfLOr8ciFlIe
- Output for 5.4.37
- $2y$10$PFoe9NfuZSSCgj2fk6hB5O0alY4KXuwvac8wu2mOLpJjFOPur0YN.
- Output for 5.4.36
- $2y$10$UWmt5lJK1k2vTlb0dlWejOktfo.2t6P9nq/g.m9e9ow.6/lv//OeG
- Output for 5.4.35
- $2y$10$dgpfT0/plOzI5wHAYIvhXuutnaa/U35ElnN8VMGjqEKdgHsHUzDT.
- Output for 5.4.34
- $2y$10$jLFoVjxXhDUj6JrTt6L9be631cvETA4ZCeqXrzqtQPMRpQf3J7Lie
- Output for 5.4.32
- $2y$10$p31c0DXvW4ooN9jRMYGiOepNIoIaruHlshV9LPc.EpKhDJebIXo62
- Output for 5.4.31
- $2y$10$NFpLxKVW9TUvztV7rISxc.yyPClY/RMvxSLwOjYYH4F5R69O0nGD.
- Output for 5.4.30
- $2y$10$dWPBP89A7YjNvlFXUojh4ed3elXiBJspqeJx3NglPzGcmDV/Qe7/W
- Output for 5.4.29
- $2y$10$s7SQn7LyBDlD7K3wUDfxv.GnVINOCJhLIwEmW1UvrxGuxNGBGWat2
- Output for 5.4.28
- $2y$10$a2oFB2l9hd.DHLCBxWZdGeW.d.MlX1tWCJWLrUbCJGsOI0LXAZsbK
- Output for 5.4.27
- $2y$10$UvFaEae74LJ14IgYACfIBeTlu.RDhfGnMuNiLOaQ17yaTAuvGQM4W
- Output for 5.4.26
- $2y$10$sZjb0gn6BYMfiwj0zU5J7.3XLVM/Apb.fytiFoJ8wvGkZ5drxvT82
- Output for 5.4.25
- $2y$10$233IUzjxDL1OJNdtrz6nWezn3806RsoZfcJ3XIHXygvPJWeLivVCC
- Output for 5.4.24
- $2y$10$03KsHmOQaYfnQ7Nx/vflGuWdi3G190MizQc7DV9XAYYB9o/uxgKC6
- Output for 5.4.23
- $2y$10$gstJT8/xzcuOMXBubkmO9.d/gazEFaGMLWkC9d.LgFsME.D5pJlGW
- Output for 5.4.22
- $2y$10$/RViTObT4E6gFWgdTVJdq.nJ4.tWMTwin6lSpBYDSIM93jmDccNDy
- Output for 5.4.21
- $2y$10$Zr6XaBlzOTzUlWA1EAsene3q2mVVJx6RF/MgHghQvp1CDD9TLe3eS
- Output for 5.4.20
- $2y$10$ndxg1kno6txNpGPk8rQbNeRUpauksUrnGMeGUUd7VNKrQhygOfjG6
- Output for 5.4.19
- $2y$10$0FHs4IRr3moONlVbI22fHe7oq2XwT4kWPWCCJt8nh0kZItyhgioEm
- Output for 5.4.18
- $2y$10$.anmtVF9yo6OhjzEydIJQOt9FnqpuDZAqKbdjLzdmxOe7DA28Syyi
- Output for 5.4.17
- $2y$10$rwiajwKbWDAjtPiFy9Se6u31/b4QuLSVaPcj9Lf6T7qJBoHNQcvdm
- Output for 5.4.16
- $2y$10$Z7xfCqp.dOxisXGm4HpP4ulNFsNCprrcNa1Jf8UVtGwcLBx3IJbhq
- Output for 5.4.15
- $2y$10$Mp0A8bubyn0Mmvm94yAdDOEYxfPNzM8kCahM6NUAOmQN4oyEXV0bC
- Output for 5.4.14
- $2y$10$DpSnsWHLRB/BKlrywb0t6.VPlXhwMksPcxNtL6QeG7vQBLCmohC5.
- Output for 5.4.13
- $2y$10$K5iarmYwcsggyt8d00T5zuWPY5Bt1gxSfMbFX3RrFZUOjvVSETgPW
- Output for 5.4.12
- $2y$10$E2/k0sbhTfkr6HKWE/5D/eVuYolZlDo3pBhqWj1LC.sg2nyIqVCfa
- Output for 5.4.11
- $2y$10$xiNOdTRV8KFNZTdfUHfd0uQvb0Sn54Iody7XYtPI9MXLe4AnJF4vi
- Output for 5.4.10
- $2y$10$WV2STPsUElBVMKoRY7Sb/OyxY/B5shFVzmXarvWf7WQeONlkhyDCK
- Output for 5.4.9
- $2y$10$VtVMkLQgNY8kkhHpMqumMOi1aNW4WboAzQ7Uoi0P6FP5EwYeOY1RO
- Output for 5.4.8
- $2y$10$9gRtzomj9mEZZaXTw4czFudxQUEPvTX.na67l4471mNrOfZmto.EW
- Output for 5.4.7
- $2y$10$mcGZl/1W7ai6fWp7a7WeKu4.99O7CZkbuaEPlhJcsXxZX1rWHcSAm
- Output for 5.4.6
- $2y$10$PeTGiiyDxRZCXVaqjb.jPui1U.5rX.TO3vqJmPCMQyaETmWiDnxlC
- Output for 5.4.5
- $2y$10$s/FWL1yNddMsBsOZJsSqV.FJMS86zpFjpDTu2INeCMaxfko9n6vs6
- Output for 5.4.4
- $2y$10$3uKF4CKkhX/5t1PeefIIgehbHzRiqVi1y1Sz0/aZfVqTKHYAZ1uUe
- Output for 5.4.3
- $2y$10$ofmbxy0oy1oS5bskRDIcjOM32wjXjnJcBR3BnRiniGyPgLu/U5UXu
- Output for 5.4.2
- $2y$10$cjESSNDqxy0Zz3N61eHJC.a2xMb9MYK7iSs1Zw1KJM4uUdgO8jwIK
- Output for 5.4.1
- $2y$10$sZ.nH09I5ZSNyOvbghisMuhilvbp2qbWCZkRoCsKh7UvqVuIFoIjy
- Output for 5.4.0
- $2y$10$uTfMtv3OL8VoU8WVJVZwd.3TODNo8Ec2badEHLPtg3lUalKYE2F16
- Output for 5.3.29
- $2y$10$BuDjYOD9tq/9maAz.p2R9OTZYvyHFIpCQVP1R8/NL8YJ6QFmB23q6
- Output for 5.3.28
- $2y$10$wJvYrabk674RdMjLraeKbOwrgFlAlVVjO9gT/vfOYy1hCwBmKVKcu
- Output for 5.3.27
- $2y$10$0G6IZfX8ZdXBWXOhAZhOReS2ILcfcSmVxX0uXk8CAYc77XQg//2l6
- Output for 5.3.26
- $2y$10$WmFz2O89F57F60Gjzky.FuobBtC0tNsTx5/mkkRatOOstLqXoHk5O
- Output for 5.3.25
- $2y$10$Irr6DH3oZ5cV23NLr.gyROzp/2cIbya7n1zAtzjwEEOVv9tP0c8Am
- Output for 5.3.24
- $2y$10$rR.LQooZwp9EhbFWKk0F4Oqgp.nnZKPcwEjCMiRsZynprY4qSmILO
- Output for 5.3.23
- $2y$10$1rRJOVnJEbKZwnuNx6d53utbe9NwgJkrveVMW5PvLwJMbOL.Mpb5O
- Output for 5.3.22
- $2y$10$derDh99MOgCmz45WKJ1upuL0UkuwYnf0BOR9cI.GDTupd8EMqHQqm
- Output for 5.3.21
- $2y$10$u0ZbyM.zQUdcoOOIYXXmPupb3ieJaCf3hwLWWvCwTm78CygnK5/te
- Output for 5.3.20
- $2y$10$ygv0PygwhxOho42VUnKmFeMf5c6oprrse6eLiv.tiAo33UMWvq7lO
- Output for 5.3.19
- $2y$10$PhiLs7p/T18LUo2tFlGnYeRUrhDD/2qlURaMhmd90X5xRZpkPm4v2
- Output for 5.3.18
- $2y$10$MCG6uelLITvqbGGdDAfFyuSK7Gl5YlJOzsHvnwo2AP4V1YONO7oFi
- Output for 5.3.17
- $2y$10$1.QB2e6zZDaYNeDVvXIyY.AIQ7MnWJrsvFjkxcAIc9UlEMiMx3.aa
- Output for 5.3.16
- $2y$10$p074nYAQOYOPDZHVXYs6/ufZYOC16M7Xv1yvZtgQfR6WgoORfQSWu
- Output for 5.3.15
- $2y$10$tT2KQpAB7sbO/4C75SYqdeQin68.oEFNOFQcABXgWbR5FYf/lq6Gy
- Output for 5.3.14
- $2y$10$C6xlHc1WsWwYKYer.HOWo.Z/EMxMeXRIc9oqDxaSGL8EDwS5LSUNm
- Output for 5.3.13
- $2y$10$qYmpqdMtlLruHQ8KxnU3iOjS/jggLb3EhIfNU/pruIEP14C.1qNqm
- Output for 5.3.12
- $2y$10$TZ333mmly4ujxci1/v9Q3.Hpk9bNz/L9.Eu4v1dKCA2ijHK0zGfzy
- Output for 5.3.11
- $2y$10$6LUN9/0ZTmvY.5/W3C1l1OgpACvzokznRLa9KtEw8M1O5JZ6Nq.Ei
- Output for 5.3.10
- $2y$10$nKU5m9j1YuS9S2BQiJXX0.qG5Pwh8F2H4/NAKvIdyhJDfXZk0a9f6
- Output for 5.3.9
- $2y$10$PyJMwFina7d5OHT6051IkeFZzxXMEodA5l8sFwEZNOErHp1jhzdd.
- Output for 5.3.8
- $2y$10$qzILs4GjjAKDNhNB7yLO1.Ot2TJD5diin.StX4OIkrqcoFDlVTumK
- Output for 5.3.7
- $2y$10$1C8ygZF3C3HdCMsYZ9Pf4esw2Nrp6cWgVLWW9m6EeJoQ0htdZfRmO
- Output for 5.3.0 - 5.3.6
preferences:
113.45 ms | 401 KiB | 163 Q