Мои сгенерированные соли одинаковы

Итак, я «случайно» генерирую две соли для использования с последующим шифрованием и хэшированием. Они создаются в процессе установки приложения и затем копируются в файл глобальной конфигурации с помощью:

file_put_contents()

Теперь, когда они сгенерированы, я могу просмотреть их в моем файле «globalParams.php». Они хранятся в виде значений массива, но этот массив вообще не используется в этом процессе установки.

Код для генерации выглядит следующим образом:

// Let's generate some encryption salts:

$options = [
'cost' => 12,
'salt' => mcrypt_create_iv(32, MCRYPT_DEV_URANDOM),];

$salt = password_hash(mt_rand(), PASSWORD_BCRYPT, $options);
$salt = password_hash($salt, PASSWORD_BCRYPT, $options);

$salt2 = password_hash(mt_rand(), PASSWORD_BCRYPT, $options);
$salt2 = password_hash($salt2, PASSWORD_BCRYPT, $options);

После этого они помещаются в файл конфигурации примерно так:

// Let's open up our template globalParams.php and replace some strings..

$editFile = file_get_contents('newGlobalParams.php');

$editFile = str_replace( "database_hostname", $hostname, $editFile );
$editFile = str_replace( "database_username", $dbUser, $editFile );
$editFile = str_replace( "database_password", $dbPass, $editFile );
$editFile = str_replace( "database_name", $database, $editFile );

$editFile = str_replace( "encryption_salt", $salt, $editFile );
$editFile = str_replace( "encryption_salt2", $salt2, $editFile );

// Replace the original globalParams.php now that the system is set up..

file_put_contents('../_includes/globalParams.php', $editFile);

И это пример выходных данных:

$parameters['main']['salt']   = "$2y$12$cLSGeEoau5/4NEZ3Fe8qquxwUBc6aL5fmcYUlQtavdoIY1L7NKnaG";
$parameters['main']['salt2']   = "$2y$12$cLSGeEoau5/4NEZ3Fe8qquxwUBc6aL5fmcYUlQtavdoIY1L7NKnaG2";

Почему они идентичны, но с добавлением 2?

При необходимости можно выложить больше кода, включая весь файл установщика.

Ta.

Редактировать:

Вот результаты, которые отражаются сразу после генерации:

$2y$12$uuZoLwioBePD9aDozrOJkus3e/DuShspaqKzzCDVne6BwVsyDkBA2
$2y$12$uuZoLwioBePD9aDozrOJkuicthSCvq2mpGTQlKNGZ.jLUUrfSDEq.

Значения сбрасываются в «globalParams.php»:

$parameters['main']['salt']   = "$2y$12$uuZoLwioBePD9aDozrOJkus3e/DuShspaqKzzCDVne6BwVsyDkBA2";
$parameters['main']['salt2']   = "$2y$12$uuZoLwioBePD9aDozrOJkus3e/DuShspaqKzzCDVne6BwVsyDkBA22";

Шаблон ‘globalParams.php’:

<?php

// Global configurations file

$parameters['dbC']['hostname']  = "database_hostname";
$parameters['dbC']['username']  = "database_username";
$parameters['dbC']['password']  = "database_password";
$parameters['dbC']['database']  = "database_name";

$parameters['main']['salt']   = "encryption_salt";
$parameters['main']['salt2']   = "encryption_salt2";

session_start(); // Start the session, ready for the user to login with.
putenv( "TZ=Europe/London" ); // Set the timezone for cookies and the sessions.

require_once('databaseFunctions.php');
require_once('coreFunctions.php');

if(file_exists('_install/')) { // Ensures no malicious user can reinstall the application using their own data..

exit( "Please delete the \"install\" directory." );

}

0

Решение

Проблема заключается в следующем:

$editFile = str_replace( "encryption_salt", $salt, $editFile );
$editFile = str_replace( "encryption_salt2", $salt2, $editFile );

Вы заменяете encryption_salt в encryption_salt2 на первой замене.
Тогда вторая замена ничего не делает, потому что шаблон encryption_salt2 более не существует.

3

Другие решения

Flosculus уже ответил на ваш вопрос, но, тем не менее, я хотел бы указать на некоторые другие детали.

То, как вы генерируете «соли», очень дорого. Я не уверен, какова их цель, на самом деле есть четыре варианта:

  1. Используется в качестве ключ для шифрования
  2. Используется в качестве IV для шифрования
  3. Используется в качестве ключ / перец для хеширования пароля
  4. Используется в качестве поваренная соль для хеширования пароля

Для хэширования паролей (случай 4) было бы лучше полностью пропустить параметр соли, password_hash () Затем автоматически сгенерирует безопасную соль для каждого пароля. Абсолютно ненужным и вредным для ваших серверов является использование растяжения ключа для соли, одна и та же соль не должна использоваться для более чем одного пароля, и вы теряете энтропию, создавая ее таким образом.

То же самое касается шифрования. Если вам нужен ключ (случай 1), просто сгенерируйте несколько случайных байтов и используйте bin2hex () для хранения их для чтения в файле конфигурации. Если вам нужен IV (случай 2), вы должны сгенерировать его для каждого текста, который вы хотите зашифровать, и сохранить его со своей зашифрованной строкой. IV не должен использоваться для более чем одной зашифрованной строки.

0

По вопросам рекламы [email protected]