mysql — PHP crypt () и Coldfusion

Мы уходим от 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, выглядит следующим образом:

  • user_email: [email protected]
  • user_code: $1$xxxxxxxx$
  • пользовательский пароль: $1$xxxxxxxx$xxxxxxx

Пароль пользователя имеет вид $ 1 $ xxxxxxxx $ prff0mAKPVBHNKOlRradj1 — 34 символа, включая предварительно введенный код пользователя.

В настоящее время мы выполняем аутентификацию, заставляя CF отправлять необработанный пользовательский ввод (электронная почта + пароль), а также полученный user_code (который PHP использует для подсчета функции crypt) на страницу PHP, чтобы отобразить пароль и сравнить с тем, что в БД.

Я в основном затрудняюсь определить, как я могу точно отобразить информацию пользователя в CF, используя существующую соль.

Спасибо!

1

Решение

(Отказ от ответственности: я не парень 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

Репликация результата 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
2

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

Других решений пока нет …

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