хэш-функция, которая работает одинаково на ColdFusion MX7 и PHP 5.x?

Я работаю над старым сайтом ColdFusion MX7. Они хотят внедрить систему паролей «соленый хэш». Но некоторое время в следующем году или около того они планируют построить совершенно новый сайт PHP и не хотят перезаписывать (потерять) все пароли.

Поэтому я ищу код, который будет работать на обеих платформах.

Я новичок в этом, но, насколько я могу судить, следующие два блока кода должны делать то же самое. Однако они дают разные результаты. Кто-нибудь должен помочь?

КОД COLDFUSION:

<cffunction name="computeHash" access="public" returntype="String"> <cfargument name="password" type="string" /> <cfargument name="salt" type="string" /> <cfargument name="iterations" type="numeric" required="false" default="1024" /> <cfargument name="algorithm" type="string" required="false" default="SHA-1" /> <cfscript> var hashed = ''; hashed = hash( password & salt, arguments.algorithm, 'UTF-8' ); </cfscript> <cfloop from="1" to="#iterations#" index="i"> <cfscript> hashed = hash( hashed & salt, arguments.algorithm, 'UTF-8' ); </cfscript> </cfloop> </cffunction> 

PHP-код:

  function computeHash($password,$salt) { $hashed = ''; $hashed = hash('sha1', $password . $salt); for ($i = 1; $i <= 1024; $i++) { $hashed = hash('sha1', $hashed . $salt); } echo $hashed; } 

ОБНОВЛЕНИЕ 1: Спасибо за ваши ответы! Используя пароль «p @ ssW0rd», а соль «JjXSROiYyKkxNzTklaiErQ ==» генерирует следующие результаты:

ХОЛОДНЫЙ СИНТЕЗ:

код, часть 1:

 hashed = hash( password & salt, arguments.algorithm, 'UTF-8' ); 

генерирует:

 A0A8DE3A3B2A8BFD74766EEE126950F4462D3BCB 

код, часть 2:

 hash( hashed & salt, arguments.algorithm, 'UTF-8' ); 

генерирует:

 CFF9B75918B75761B5568854782CD709B2941637 

PHP:

код, часть 1:

 $hashed = hash('sha1', $password . $salt); 

генерирует:

 a0a8de3a3b2a8bfd74766eee126950f4462d3bcb 

код, часть 2:

 hash('sha1', $hashed . $salt); 

генерирует:

 e955404423747ec706561fa9a319ddac47194a65 

Как вы можете видеть, в первый раз выходы соответствуют. Но когда я снова хэш, они больше не совпадают. Я смущен.

ColdFusion генерирует A0A8DE3A3B2A8BFD74766EEE126950F4462D3BCB

, а PHP генерирует a0a8de3a3b2a8bfd74766eee126950f4462d3bcb

Как вы можете видеть, в первый раз выходы соответствуют.

Эти строки не идентичны. Вам нужно повернуть их оба в один и тот же случай – я бы использовал strtoupper() для сгенерированного результата PHP.

Документация Adobe для hash функции CF не отображает "SHA-1" в качестве допустимого значения для параметра algorithm . Я предполагаю, что вы должны пропустить "SHA" .

@DCoder прибил его. Проблема заключалась в том, что ColdFusion выводил весь верхний регистр, тогда как PHP выводил все строчные буквы. Таким образом, использование strtoupper () в коде PHP заставило их работать одинаково. Кроме того, SHA-512, похоже, поддерживается в CF7 и PHP 5, поэтому я перехожу к этому алгоритму. Я включил и обновленный код CF и PHP ниже для дальнейшего использования. 🙂

COLDFUSION CODE (без изменений):

 <cffunction name="computeHash" access="public" returntype="String"> <cfargument name="password" type="string" /> <cfargument name="salt" type="string" /> <cfargument name="iterations" type="numeric" required="false" default="1024" /> <cfargument name="algorithm" type="string" required="false" default="SHA-512" /> <cfscript> var hashed = ''; hashed = hash( password & salt, arguments.algorithm, 'UTF-8' ); </cfscript> <cfloop from="1" to="#iterations#" index="i"> <cfscript> hashed = hash( hashed & salt, arguments.algorithm, 'UTF-8' ); </cfscript> </cfloop> </cffunction> 

PHP CODE (с добавленным strtoupper () и новым алгоритмом):

 function computeHash($password,$salt) { $algorithm = 'sha512'; $hashed = ''; $hashed = strtoupper(hash($algorithm, $password . $salt)); for ($i = 1; $i <= 1024; $i++) { $hashed = strtoupper(hash($algorithm, $hashed . $salt)); } echo $hashed'; }