Пароль-поколения функция с помощью пользовательских семян


После прочтения статьи на черепе безопасности, отметив, потенциальные слабости в PHP mt_rand функции из-за слабого автоматического заполнения (http://ow.ly/4nrne), я решил посмотреть что-нибудь -- энтропия я могу найти в PHP. Идея в том, чтобы иметь достаточно (слабый) источников, что даже если один или два манипулируют, потеряны или восстановлены, то будет достаточно, чтобы сорвать грубой силы против полученный пароли позже.

Надеюсь, что результат можно как читать, так и полезной, хотя я не ожидал, что это будет производство-качество.

<?php
  /**
   * Return a random password.
   *
       * v1.01
   * Jumps through many hoops to attempt to overcome autoseed weakness of php's mt_rand function
   *
   */
  function myRandomPassword() {
        // Change this for each installation
        $localsecret = 'qTgppE9T2c';
    // Determine length of generated password
    $pwlength = 10;
    // Character set for password
    $pwchars = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz0123456789';
    $l = strlen( $pwchars ) - 1;
    // Get a little bit of entropy from sources that should be inaccessible to outsiders and non-static
    $dat = getrusage(); // gather some information from the running system
    $datline = md5(implode($dat)); // wash using md5 -- it's fast and there's not enough entropy to warrant longer hash
    $hardToGuess = $datline;
    $self = __FILE__; // a file the script should have read access to (itself)
    $stat = stat($self); // information about file such as inode, accessed time, uid, guid
    $statline = md5(implode($stat)); // wash
    $hardToGuess .= $statline;
    $preseed = md5(microtime()) . getmypid() . $hardToGuess . memory_get_usage() . disk_free_space('.') . $localsecret;
    $seed = sha1( $preseed ); // final wash, longer hash
    // Seed the mt_rand() function with a better seed than the standard one
    mt_srand ($seed);
    // Pick characters from the lineup, using the seeded mt_rand function
    $pw = '';
    for ( $i = 0; $i < $pwlength; $i++ ) {
      $pw .= $pwchars{ mt_rand( 0, $l ) };
    }
    // Return the result
    return $pw;
  }

echo myRandomPassword();
?>

Редакция 1.01 добавляет местный секрет.



2252
4
задан 28 марта 2011 в 02:03 Источник Поделиться
Комментарии
1 ответ

Я вообще не понимаю смысл впрыскивать столько система информации в mt_srand функции. Выглядит как полный (и даже бессмысленно) паранойя :)

Но вот вы идете с чистого кода:

<?php
/**
* Random password generator
* v2.0
*/

define('APP_SECRET_KEY', 'qTgppE9T2c');

function randomPassword($length=10) {
$charset = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz0123456789';
$charsetSize = strlen($charset) - 1;

// Seeding the generator with a bunch of different system data and the secret key
mt_srand(crc32(md5(microtime())
. getmypid()
. md5(implode(getrusage()))
. md5(implode(stat(__FILE__)))
. memory_get_usage()
. disk_free_space('.')
. APP_SECRET_KEY)
);

$password = '';
foreach (range(1, $length) as $_)
$password .= $charset{mt_rand(0, $charsetSize)};

return $password;
}

echo randomPassword(), "\n";

Возможно, Вам понравится более извращенные сверхмедленных версия, которая возвращает CRC32 в случайно заказал энтропия каждый раз, когда вы создаете новый символ.

<?php
/**
* Random password generator
* v2.1
*/

function randomPassword($length=10) {
$charset = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz0123456789';
$charsetSize = strlen($charset) - 1;

$seeders = array(
function () { return md5(microtime()); },
function () { return md5(getmypid()); },
function () { return md5(implode(getrusage())); },
function () { return memory_get_usage(); },
function () { return disk_free_space('.'); }
);

$randomSeed = function () use ($seeders) {
shuffle($seeders);

$entropy = '';
foreach ($seeders as $seeder)
$entropy .= $seeder();

return crc32($entropy);
};

$password = '';
foreach (range(1, $length) as $_) {
mt_srand($randomSeed());
$password .= $charset{mt_rand(0, $charsetSize)};
}

return $password;
}

echo randomPassword(), "\n";

2
ответ дан 31 марта 2011 в 03:03 Источник Поделиться