Drupal 7
PHP код:
$char = 'C'; // случайный символ из _password_itoa64()
$i = strpos(_password_itoa64(), $char);
$c = 1 << $i;
$pass = '*********';
$salt = '2FBl0Iou'; // обязательно 8 символов
$hash = hash('sha512', $salt.$pass, true);
// цикл_1
do {
$hash = hash('sha512', $hash.$pass, true);
} while(--$c);
$hash = _password_base64_encode($hash, strlen($hash));
echo substr('$S$'.$salt.$char.$hash, 0, 55);
function _password_base64_encode($input, $count) {
$output = '';
$i = 0;
$itoa64 = _password_itoa64();
do {
$value = ord($input[$i++]);
$output .= $itoa64[$value & 0x3f];
if ($i < $count) {
$value |= ord($input[$i]) << 8;
}
$output .= $itoa64[($value >> 6) & 0x3f];
if ($i++ >= $count) {
break;
}
if ($i < $count) {
$value |= ord($input[$i]) << 16;
}
$output .= $itoa64[($value >> 12) & 0x3f];
if ($i++ >= $count) {
break;
}
$output .= $itoa64[($value >> 18) & 0x3f];
} while ($i < $count);
return $output;
}
function _password_itoa64() {
return './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
}
от обратного:
пароль - 123456
хэш -
$S$C87652321emdHp6HUgc/hvXO5C6kIJSxxeSlyb3qsjwJvuL4nDyv
$S$ - мусор.
С - указывает, сколько раз выполняется цикл_1 (см. код выше)
87654321 - соль
шифрование:
1. $hash = hash('sha512', $salt.$pass, true);
2. цикл (выполняется 2^15 раз): $hash = hash('sha512', $hash.$pass, true);
3. $hash = _password_base64_encode($hash, strlen($hash));
4. substr('$S$C'.$salt.$hash, 0, 55);
См. drupal7/includes/password.inc