Итак, я "произвольно" генерирую две соли для использования с последующим шифрованием и хешированием. Они генерируются во время процесса установки приложения, а затем копируются в файл глобальных конфигураций через:
file_put_contents()
Теперь, когда они сгенерированы, я могу просмотреть их в файле 'globalParams.php'. Они сохраняются как значения массива, но этот массив не используется вообще в этом процессе установки.
Код для генерации выглядит следующим образом:
// Let 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 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." );
}
Проблема заключается в следующем:
$editFile = str_replace( "encryption_salt", $salt, $editFile );
$editFile = str_replace( "encryption_salt2", $salt2, $editFile );
Вы заменяете encryption_salt
в encryption_salt2
при первой замене.
Тогда вторая замена ничего не делает, потому что шаблон encryption_salt2
больше не существует.
Флокулус уже ответил на ваш вопрос, но тем не менее я хотел бы указать на некоторые другие детали.
То, как вы создаете "соли", очень дорого. Я не уверен, какова их цель, на самом деле есть четыре возможности:
Для хэш-паролей (случай 4) было бы лучше полностью оставить параметр соли, пароль_hash() автоматически генерирует безопасную соль для каждого пароля. Это абсолютно не нужно и плохо для ваших серверов, чтобы использовать ключевое растяжение для соли, та же соль не должна использоваться для более чем одного пароля, и вы теряете энтропию, создавая ее таким образом.
То же самое касается шифрования. Если вам нужен ключ (случай 1), то просто сгенерируйте некоторые случайные байты и используйте bin2hex() для хранения их читаемых в файле конфигурации. Если вам нужен IV (случай 2), вы должны сгенерировать его для каждого текста, который вы хотите зашифровать, и сохранить его зашифрованной строкой. IV не следует использовать для более чем одной зашифрованной строки.