Edit report at https://bugs.php.net/bug.php?id=62372&edit=1

 ID:                 62372
 Comment by:         jani dot ollikainen at mmd dot net
 Reported by:        jani dot ollikainen at mmd dot net
 Summary:            crypt() and broken backwards compability in SHA
                     rounds
 Status:             Open
 Type:               Feature/Change Request
 Package:            *Encryption and hash functions
 PHP Version:        5.4.4
 Block user comment: N
 Private report:     N

 New Comment:

Tested with patched 5.4.4 where:
#define ROUNDS_MIN 1

HASH: 
$6$rounds=10$qNElXs2yMnL2.GNS3kiM7DqmGbFLdQfIwu2691aJgT3xgJazPLtw7RPKz3Dp8RIc4b5fmJ7qvlq/mPN8a.rE40
 - CRYPT: 
$6$rounds=10$qNElXs2yMnL2.GNS$YwaYQmhwsN2RzBImxlEjIL.0/YLlfYCDmyfozkCQWNKdKgZQtTpK3Y/TAw31deCnJrDzgrqpI6ckvJCBsoeNB/
NO MATCH

So problem isn't only in ROUNDS_MIN. Also I know that my hash hasn't $ after 
salt, but that's how PHP 5.1.6 creates it. Tested also with adding $ and result 
is similar:

HASH: 
$6$rounds=10$qNElXs2yMnL2.GNS$3kiM7DqmGbFLdQfIwu2691aJgT3xgJazPLtw7RPKz3Dp8RIc4b5fmJ7qvlq/mPN8a.rE40
 - CRYPT: 
$6$rounds=10$qNElXs2yMnL2.GNS$YwaYQmhwsN2RzBImxlEjIL.0/YLlfYCDmyfozkCQWNKdKgZQtTpK3Y/TAw31deCnJrDzgrqpI6ckvJCBsoeNB/
NO MATCH

So something else is also different...


Previous Comments:
------------------------------------------------------------------------
[2012-06-20 10:58:38] jani dot ollikainen at mmd dot net

Description:
------------
http://fi2.php.net/manual/en/function.crypt.php

"CRYPT_SHA512 - SHA-512 hash with a sixteen character salt prefixed with $6$. 
If the salt string starts with 'rounds=<N>$', the numeric value of N is used to 
indicate how many times the hashing loop should be executed, much like the cost 
parameter on Blowfish. The default number of rounds is 5000, there is a minimum 
of 1000 and a maximum of 999,999,999. Any selection of N outside this range 
will be truncated to the nearest limit."

Why is that N put to minium of 1000? Now if I've made hash with old PHP (or 
with anything else) which has "$6$rounds=10$" I cannot check that, because if 
there's rounds mentioned PHP will do minimum of 1000 rounds and I get totally 
different hash to compare.

Sounds very nice! I can understant that rounds limit if I don't give salt to 
crypt(), but if I give a salt which has "$6$rounds=10$" it really should do 
just those 10 rounds!

Fails with:
PHP 5.4.4 (cli) (built: Jun 20 2012 13:48:48)
PHP 5.3.14 (cli) (built: Jun 20 2012 13:39:44)
PHP 5.3.3 (cli) (built: May  7 2012 19:58:17)

Works with:
PHP 5.1.6 (cli) (built: May  7 2012 15:03:06)


Test script:
---------------
<?php
$h='$6$rounds=10$qNElXs2yMnL2.GNS3kiM7DqmGbFLdQfIwu2691aJgT3xgJazPLtw7RPKz3Dp8RIc4b5fmJ7qvlq/mPN8a.rE40';
$p='salasana';
$c=crypt($p,$h);
echo "HASH: $h - CRYPT: $c\n";
if ($c == $h)
{
  echo "MATCH OK\n";
}
else
{
  echo "NO MATCH\n";
}
?>

Expected result:
----------------
HASH: 
$6$rounds=10$qNElXs2yMnL2.GNS3kiM7DqmGbFLdQfIwu2691aJgT3xgJazPLtw7RPKz3Dp8RIc4b5fmJ7qvlq/mPN8a.rE40
 - CRYPT: 
$6$rounds=10$qNElXs2yMnL2.GNS3kiM7DqmGbFLdQfIwu2691aJgT3xgJazPLtw7RPKz3Dp8RIc4b5fmJ7qvlq/mPN8a.rE40
MATCH OK


Actual result:
--------------
HASH: 
$6$rounds=10$qNElXs2yMnL2.GNS3kiM7DqmGbFLdQfIwu2691aJgT3xgJazPLtw7RPKz3Dp8RIc4b5fmJ7qvlq/mPN8a.rE40
 - CRYPT: 
$6$rounds=1000$qNElXs2yMnL2.GNS$/q7trYkbKkoJernsumbObt2IysdXGRx/ytFaG0HBC97rHHhYRQvUcyEuRHP6h5yj8V.fH7XKEw5hjofVmYONw1
NO MATCH



------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=62372&edit=1

Reply via email to