2013-02-17 1 views
2

Для аутентификации с помощью Dovecot я использую хэши SSHA256, но я не знаю, как проверить данный пароль на существующий хеш. Следующие функции PHP (нашли их в Интернете) используются для создания хэша SSHA256:Проверка пароля на хэш SSHA256 в PHP

function ssha256($pw) { 
     $salt = make_salt(); 
     return "{SSHA256}" . base64_encode(hash('sha256', $pw . $salt, true) . $salt); 
} 

function make_salt() { 
     $len = 4; 
     $bytes = array(); 
     for ($i = 0; $i < $len; $i++) { 
       $bytes[] = rand(1,255); 
     } 
     $salt_str = ''; 
     foreach ($bytes as $b) { 
       $salt_str .= pack('C', $b); 
     } 
     return $salt_str; 
} 

Пример вывод: {SSHA256}lGq49JTKmBC49AUrk7wLyQVmeZ7cGl/V13A9QbY4RVKchckL

У меня есть для извлечения соли, но как? Я полностью потерял путь для решения проблемы, есть ли у кого намек на это?

Спасибо всем за помощь!

Ох, и жаль, что я должен использовать SSHA256, потому что Dovecot 1.2.15 поддерживает только те схемы: CRYPT MD5 MD5-CRYPT SHA SHA1 SHA256 SMD5 SSHA SSHA256 PLAIN CLEARTEXT CRAM-MD5 HMAC-MD5 DIGEST-MD5 PLAIN-MD4 PLAIN-MD5 LDAP-MD5 LANMAN NTLM OTP SKEY RPA

+1

Вы должны использовать криптографически безопасную соль и повторное хеширование. Еще лучше, просто используйте bcrypt, который делает все это для вас. – SLaks

ответ

2

Вы не должны использовать семейство SHA для хэширования паролей. Они быстро и предназначены для файлов хеширования со скоростью. Хеширование пашков должно быть дорогой. Используйте Bcrypt, PHPass или просто использовать этот класс, который я свернутый себя (но пока вы не научитесь выискивать в нем):

class PassHash { 
    public static function rand_str($length) { 
     $total = $length % 2; 
     $output = ""; 
     if ($total !== 0) { 
      $count = floor($length/2); 
      $output .= "."; 
     } else $count = $length/2; 

     $bytes = openssl_random_pseudo_bytes($count); 
     $output .= bin2hex($bytes); 

     // warning: prepending with a dot if the length is odd. 
     // this can be very dangerous. no clue why you'd want your 
     // bcrypt salt to do this, but /shrug 

     return $output; 
    } 
    // 2y is an exploit fix, and an improvement over 2a. Only available in 5.4.0+ 
    public static function hash($input) { 
     return crypt($input, "$2y$13$" . self::rand_str(22)); 

    } 

    // legacy support, add exception handling and fall back to <= 5.3.0 
    public static function hash_weak($input) { 
     return crypt($input, "$2a$13$" . self::rand_str(22)); 
    } 

    public static function compare($input, $hash) { 
     return (crypt($input, $hash) === $hash); 
    } 
} 

Вы должны хеширования открытого текста заданного и сравнить этот хэш против одного Сохранив , Соли хранятся в хешах и должны быть случайными. Если хотите, добавьте перец. Вы также должны внести переменную workrate, чтобы вы могли изменить рабочую скорость в любой момент, когда это необходимо, и по-прежнему работать в вашей системе.


Если, как вы говорите, у вас нет никакой возможности реализации этого, вы можете распаковать хэш следующим образом:

function unpack_hash($hash) { 
     $hash = base64_decode($hash); 
     $split = str_split($hash, 64); 
     return array("salt" => $split[1], "hash" => $split[0]); 

Это потому, что SHA256 составляет 256 бит, или 64 шестнадцатеричных символов. Вы всегда можете предположить, что первые 64 символа - это хеш

+0

Привет, большое спасибо за ваш ответ! Я использую Bcrypt для всех моих скриптов, но, к сожалению, Dovecot 1.2 не поддерживает его. Эти поддерживаемые схемы: CRYPT MD5 MD5-Crypt ША SHA1 SHA256 SMD5 SSHA SSHA256 РАВНИНА ClearText CRAM-MD5 HMAC-MD5 DIGEST-MD5 РАВНИНА-MD4 РАВНИНА-MD5 LDAP-MD5 LANMAN NTLM ОТП SKEY РПА – Fips

+0

Ай. Нет возможности добавить поддержку? – Amelia

+1

Большое вам спасибо за помощь! Согласно [этому вопросу] (http://stackoverflow.com/questions/4099333/how-to-generate-a-good-salt-is-my-function-secure-enough) я заменил соль 'uniqid() '. О, и мне пришлось удалить скобки: 'str_replace ('{SSHA256}', '', $ hash);' Спасибо! – Fips

2

Вы должны хранить соль вместе со значением хэшированного.

Когда вам нужно подтвердить пароль, вы просто пересчитываете хэш снова с помощью пароля ввода пользователя + сохраненной соли. Если хеши совпадают, пользователь вводит правильный пароль.

Для вашего формата используйте сначала base64_decode, последние 4 байта результата будут солью.

+0

Привет, спасибо за ваш быстрый ответ! Соль фактически хранится с хешем, но я не знаю, как ее получить из необработанного формата, упакованного в Base64. – Fips

+0

@Fips, 'base64_decode' – Amelia

+0

Посмотрите, соль добавлена ​​к хешу (исходный вывод), а затем вся вещь получает кодировку Base64. Когда я пытаюсь использовать base64_decode, я получаю двоичные данные, но я не знаю, что с ним делать. – Fips

 Смежные вопросы

  • Нет связанных вопросов^_^