3v4l.org

run code in 300+ PHP versions simultaneously
<?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