Мы уходим от PHP & MySQL для чистой платформы CF / MSSQL, и я хотел бы взять с собой наши учетные записи пользователей из MySQL.
Учетные записи пользователей изначально создавались на сайте PHP / MySQL и хранились с использованием 8-символьной соли и пароля, зашифрованного в MD5, например:
ISzYi6zf
$1$ISzYi6zf$prff0mAKPVBHNKOlRradj1
С известной мне солью и зашифрованным паролем я хочу иметь возможность «перестроить» строку из 34 символов из пользовательского ввода в CF, чтобы сравнить с тем, что хранится в базе данных.
Пока что ничего из того, что я пробовал в CF, не позволило мне «перестроить» полученную строку из 34 символов, чтобы я мог сравнить их с тем, что находится в базе данных, т.е. Я хочу принять пользовательский ввод, добавить к нему известную соль и найти строку из 34 символов, чтобы сравнить их.
Спасибо за любую помощь!
ОБНОВИТЬ:
@Leigh, вот код, который PHP использует для аутентификации:
<?
$user_salt = $_POST["user_salt"];
$password = $_POST["password"];
$pass_meth = $_POST["pass_meth"];
if(strlen($user_salt) > 8 && $pass_meth > 0)
{
list($salt1, $salt2) = str_split($user_salt, ceil(strlen($user_salt) / 2));
$salty_password = $salt1.$password.$salt2;
$pass_to_use = md5($salty_password);
}
else
{
if(strlen($user_salt) > 8)
{
$user_salt = "$1$".str_pad(substr($user_salt, 0, 8), 8, '0', STR_PAD_LEFT)."$";
}
else
{
$user_salt = "$1$".substr($user_salt, 0, 8)."$";
}
$pass_to_use = crypt($password, $user_salt);
}
echo $pass_to_use;
?>
Информация, которую мы имеем в базе данных MySQL, выглядит следующим образом:
[email protected]
$1$xxxxxxxx$
$1$xxxxxxxx$xxxxxxx
Пароль пользователя имеет вид $ 1 $ xxxxxxxx $ prff0mAKPVBHNKOlRradj1 — 34 символа, включая предварительно введенный код пользователя.
В настоящее время мы выполняем аутентификацию, заставляя CF отправлять необработанный пользовательский ввод (электронная почта + пароль), а также полученный user_code (который PHP использует для подсчета функции crypt) на страницу PHP, чтобы отобразить пароль и сравнить с тем, что в БД.
Я в основном затрудняюсь определить, как я могу точно отобразить информацию пользователя в CF, используя существующую соль.
Спасибо!
(Отказ от ответственности: я не парень PHP). Игнорируя основные строковые функции, похоже, что ключевые части кода включают две функции: md5
а также crypt
,
Из того, что я прочитал, нет встроенного эквивалента PHP крипты (). Тем не менее, есть Java-реализация этого алгоритма в библиотеке кодеков Apache Commons, которую можно использовать из CF. Загрузите последнюю версию Кодек Apache Commons **. Затем загрузите банку через this.javaSettings
в вашем файле Application.cfc. После загрузки вы можете создать экземпляр Md5Crypt класс и генерировать хэш.
Холодный синтез:
Md5Crypt = createObject("java", "org.apache.commons.codec.digest.Md5Crypt");
salt = "$1$ISzYi6zf$";
data = charsetDecode("some value to hash here", "utf-8");
result = Md5Crypt.md5Crypt(data, salt);
writeDump( Md5Crypt.md5Crypt(data, salt) );
PHP:
$salt = "$1$"."ISzYi6zf"."$";
$data = "some value to hash here";
$result = crypt($data , $salt);
echo $result;
Результат:
$1$ISzYi6zf$lqApYqSEt9fzpSDEZxuK00
** Кодек Apache Commons в комплекте с CF. Однако в комплекте jar содержится уменьшенная версия, в которой отсутствует класс MD5Crypt.
Репликация результата md5 проще. Эквивалентная функция в CF Хэш (). Единственное отличие в том, что CF преобразует результат в верхний регистр. использование LCase () чтобы соответствовать результату PHP:
Холодный синтез:
salt1 = "ISzYi";
salt2 = "6zfXX";
password = "some value to hash here";
WriteOutput( lcase(hash(salt1 & password & salt2)) );
PHP:
$salt1 = "ISzYi";
$salt2 = "6zfXX";
$password = "some value to hash here";
echo( md5($salt1.$password.$salt2) );
Результат:
c23d4661e1ef7866a4296658e3335dbc
Других решений пока нет …