Как вычислить теневой пароль для sha-512 с помощью php / shell - PullRequest
1 голос
/ 29 октября 2011

Я создал учетную запись sysadmin с паролем delme.Затем я хочу вычислить sha-512 пароля с помощью php.

Я ожидал, что это должно произвести тот же хэш ...

billy@iserve:~$ sudo cat /etc/shadow | grep sysadmin
sysadmin:$6$q5HxMEDr$VUPS0JrRFv5bohFtsscvjQ7t2fUhi0m2z8f0ObKtorwlSHqiGde8N9hprkqmnB9LOtEDorG.3yBSXYSAKcJmz.:15276:0:99999:7:::
billy@iserve:~$ php -r "echo crypt('delme','$6$rounds=5000$q5HxMEDr$').\"\n"\";"
=54Jjswxnfslg

Я не могу повторить пароль в тенифайл ... можешь сказать как?

Ответы [ 4 ]

1 голос
/ 30 октября 2011

Я закончил этим, чтобы решить мою проблему ...

/*    Need to add www-data to group shadow (and restart apache)
        $ sudo adduser www-data shadow
        $ sudo /etc/init.d/apache2 restart
      Needs whois to be installed to run mkpasswd
        $ sudo apt-get install whois
      Assumes that sha-512 is used in shadow file
*/

function authenticate($user, $pass){
  // run shell command to output shadow file, and extract line for $user
  // then split the shadow line by $ or : to get component parts
  // store in $shad as array
  $shad =  preg_split("/[$:]/",`cat /etc/shadow | grep "^$user\:"`);
  // use mkpasswd command to generate shadow line passing $pass and $shad[3] (salt)
  // split the result into component parts and store in array $mkps
  $mkps = preg_split("/[$:]/",trim(`mkpasswd -m sha-512 $pass $shad[3]`));
  // compare the shadow file hashed password with generated hashed password and return
  return ($shad[4] == $mkps[3]);
}

// usage...
if(authenticate('myUsername','myPassword')){
  // logged in   
} else {
  // not valid user
}

Я не совсем уверен в безопасности этого метода, поэтому задам вопрос об этом.

1 голос
/ 29 октября 2011

Это потому, что реальная система использует случайно сгенерированную соль (между вторым $ и третьим $). Вы используете эту же соль в своем php-коде?

0 голосов
/ 02 сентября 2016

Небольшое обновление ответа Билли:

function authenticate($user, $pass){
  $shad =  preg_split("/[$:]/",`cat /etc/shadow | grep "^$user\:"`);
  if (!isset($shad[2]) || !isset($shad[3])) return false;
  $mkps = preg_split("/[$:]/",crypt($pass, '$'.$shad[2].'$'.$shad[3].'$'));
  return ($shad[4] == $mkps[3]);
}
0 голосов
/ 26 февраля 2014

В вашем PHP-коде просто ошибка. Вы должны экранировать символ $!

$ echo "<?php \$foo=crypt('delme', '\$6\$q5HxMEDr\$'); echo \$foo; ?>" | php5-cgi; echo ""
X-Powered-By: PHP/5.4.4-14+deb7u7
Content-type: text/html

$6$q5HxMEDr$VUPS0JrRFv5bohFtsscvJQ7tZfUhi0m2z8f0ObKtorwlSHqiGde8N9hprkqmnB9LOtEDorG.3yBSXYSAKcJmz.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...