2012-04-05 3 views
3

Ich arbeite an einer älteren ColdFusion MX7-Site. Sie möchten ein Passwort-System "Salted Hash" implementieren. Aber irgendwann im nächsten Jahr oder so planen sie, eine komplett neue PHP-Site zu bauen und wollen nicht alle Passwörter zurücksetzen (verlieren).Hash-Funktion, die auf ColdFusion MX7 und PHP 5.x identisch funktioniert?

Also ich bin auf der Suche nach Code, der auf beiden Plattformen funktioniert.

Ich bin neu hier, aber soweit ich das beurteilen kann, sollten die folgenden zwei Blöcke des Codes das gleiche tun. Sie erzeugen jedoch unterschiedliche Ergebnisse. Will jemand helfen?

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-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 CODE:

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

UPDATE 1: Vielen Dank für Ihre Antworten! Mit einem Passwort von "p @ ssw0rd" und ein Salz von "JjXSROiYyKkxNzTklaiErQ ==" erzeugt die folgenden Ergebnisse:

COLDFUSION:

Code, Teil 1:

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

erzeugt:

A0A8DE3A3B2A8BFD74766EEE126950F4462D3BCB 

Code, Teil 2:

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

erzeugt:

CFF9B75918B75761B5568854782CD709B2941637 

PHP:

Code, Teil 1:

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

erzeugt:

a0a8de3a3b2a8bfd74766eee126950f4462d3bcb 

Code, Teil 2:

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

erzeugt:

e955404423747ec706561fa9a319ddac47194a65 

Wie Sie das erste Mal, um zu sehen, das Spiel gibt. Aber wenn ich erneut hashe, stimmen sie nicht mehr überein. Ich bin verwirrt.

+2

-Test, ist die falsche. http://www.sha1-online.com/; Vielleicht können Sie das Ergebnis für jede Iteration ausdrucken (Sie brauchen wahrscheinlich keine 1024, 2 genügt). – j13r

+0

wie sind sie anders? Könnten Sie ein Beispiel für Eingaben und Ausgaben veröffentlichen? – ryber

+0

Auch produziert es das gleiche Ergebnis, wenn Sie es nur einmal tun, nehmen Sie den Looping-Teil. – ryber

Antwort

11

Coldfusion erzeugt A0A8DE3A3B2A8BFD74766EEE126950F4462D3BCB

und PHP erzeugt a0a8de3a3b2a8bfd74766eee126950f4462d3bcb

Wie Sie das erste Mal, um zu sehen, das Spiel gibt.

Diese Zeichenfolgen sind nicht identisch. Sie müssen beide in den gleichen Fall drehen - ich würde strtoupper() auf PHP-Ergebnis verwenden.

0

Adobe documentation für CF hash Funktion listet nicht "SHA-1" als gültiger Wert für den Parameter algorithm. Ich denke, Sie sollten stattdessen "SHA" übergeben.

+0

Ich denke 'SHA' ist nur ein Alias ​​für' SHA-1' – Leigh

+0

Leigh ist richtig, man kann auch SHA-1 sagen, es funktioniert gut. Wenn man sich die Verschlüsselung anschaut, listet sie eigentlich "SHA-1" und nicht "SHA" auf. – ryber

+0

Ich ging gerade mit dem, was der Doc sagte, aber es wäre nicht das erste undokumentierte Feature in CF. – Josh

0

@DCoder hat es genagelt. Das Problem war, dass ColdFusion nur Großbuchstaben ausgab, während PHP nur Kleinbuchstaben ausgab. Durch die Verwendung von strtoupper() im PHP-Code funktionierten sie also identisch. Außerdem scheint SHA-512 in CF7 und PHP 5 unterstützt zu werden, also wechsle ich zu diesem Algorithmus. Ich füge sowohl den aktualisierten CF- als auch den PHP-Code zur zukünftigen Referenz hinzu. :)

Coldfusion-Code (unverändert mit Ausnahme Algorithmus):

<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 (mit strtoupper() hinzugefügt und neuem Algorithmus):

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'; 
} 
+0

"@DCoder hat es genagelt" ... Dann hättest du seine Antwort als akzeptierte Antwort auswählen sollen, damit sie die passende Belohnung bekommen, um es richtig zu machen. Sag einfach ... –

+0

siehe vorherigen Kommentar – Stofke