2010-06-02 5 views
-1

J'essaie de créer une version PHP d'un programme JSP existant, mais je suis bloqué à la partie de cryptage de mot de passe.convertir le cryptage de mot de passe de java à php

Pourriez-vous s'il vous plaît me dire comment convertir celui-ci? Je sais qu'il essaie d'obtenir le md5() mais après ça, je ne comprends pas. Je me perds dans les parties Stringbuffer et for().

Pouvez-vous m'aider?

public static String encryptPassword(String password) 
{ 
    String encrypted = ""; 
    try 
    { 
     MessageDigest digest = MessageDigest.getInstance("MD5"); 
     byte[] passwordBytes = password.getBytes(); 

     digest.reset(); 
     digest.update(passwordBytes); 
     byte[] message = digest.digest(); 

     StringBuffer hexString = new StringBuffer(); 
     for (int i=0; i < message.length; i++) 
     { 
      hexString.append(Integer.toHexString(
       0xFF & message[ i ])); 
     } 
     encrypted = hexString.toString(); 
    } 
    catch(Exception e) { } 
    return encrypted; 
} 
+1

Juste pour info (je suis sûr que vous savez déjà,) ce n'est pas le cryptage, c'est hashing. :) –

+0

oui c'est, je me demandais aussi pourquoi la fonction a été appelée encryptPassword: P – Obay

+0

@Obay Dans le titre de la question: "chiffrement de mot de passe". – zaph

Répondre

3

Iraklis devrait être droite. md5() vous donne une chaîne de sortie codée en hexadécimal par défaut. Vous obtenez uniquement les octets non codés comme dans Java en passant en TRUE pour l'argument $raw_output facultatif.

les longueurs niveau de 29 à 32

Ensuite, votre code Java a un bug. Les hachages MD5 sont toujours de 128 bits (32 chiffres hexadécimaux). Ici, il est:

hexString.append(Integer.toHexString(0xFF & message[ i ])); 

cela va générer 1 au lieu de 01 pour tous les octets ci-dessous 16. Qu'est-ce que vous avez enregistré est un hachage mutilée, à partir de laquelle vous ne pouvez pas récupérer la valeur MD5 d'origine. Si vous devez absolument garder ces données cassées, vous devrez reproduire le bug en PHP:

function makeBrokenMD5($s) { 
    $hash= md5($s, TRUE); 
    $bytes= preg_split('//', $hash, -1, PREG_SPLIT_NO_EMPTY); 
    $broken= ''; 
    foreach ($bytes as $byte) 
     $broken.= dechex(ord($byte)); 
    return $broken; 
} 
+0

bobince, spot on, juste testé il produit les hachages java brisés. – Iraklis

1

Il convertit le hachage MD5 en une chaîne de nombres hexadécimaux de l'octet le moins significatif du caractère. En Java, tous les caractères sont de 2 octets.

En pratique, cela signifie simplement la valeur ASCII.

+0

Qu'est-ce que cela signifie exactement en PHP? Appelle-t-il un md5() puis un ord() pour chaque caractère généré à partir du md5? – Obay

+0

Je suppose que bin2hex (md5 (mot de passe, vrai)) devrait se rapprocher –

1
<?php 
$password = "MyPass"; 
$hash = md5($password); 
?> 

MISE À JOUR: Il existe des différences entre les deux versions. Pour résoudre ce problème voir @bobince answer.Here est le code de test:

Java

package tests; 

import java.security.MessageDigest; 

/** 
* Created by IntelliJ IDEA. 
* User: Iraklis 
* Date: 2 Ιουν 2010 
* Time: 2:15:03 μμ 
* To change this template use File | Settings | File Templates. 
*/ 
public class Md5Test { 
    public static String encryptPassword(String password) { 
     String encrypted = ""; 
     try { 
      MessageDigest digest = MessageDigest.getInstance("MD5"); 
      byte[] passwordBytes = password.getBytes(); 

      digest.reset(); 
      digest.update(passwordBytes); 
      byte[] message = digest.digest(); 

      StringBuffer hexString = new StringBuffer(); 
      for (int i = 0; i < message.length; i++) { 
       hexString.append(Integer.toHexString(
         0xFF & message[i])); 
      } 
      encrypted = hexString.toString(); 
     } 
     catch (Exception e) { 
     } 
     return encrypted; 
    } 

    public static void main(String[] args) { 
     System.out.println("Pass1 md5 = " + encryptPassword("Test123FORXTREMEpass")); 
     System.out.println("Pass1 md5 = " + encryptPassword("Ijdsaoijds")); 
     System.out.println("Pass1 md5 = " + encryptPassword("a")); 
     System.out.println("Pass1 md5 = " + encryptPassword(" ")); 
    } 

} 


Output: 
Pass1 md5 = dc3a7b42a97a3598105936ef22ad2c1 
Pass1 md5 = df7ca542bdbf7c4b8776cb21c45e7eef 
Pass1 md5 = cc175b9c0f1b6a831c399e269772661 
Pass1 md5 = 7215ee9c7d9dc229d2921a40e899ec5f 

PHP

<?php 
echo "Pass1 md5 = ".md5("Test123FORXTREMEpass")."<BR>"; 
echo "Pass2 md5 = ".md5("Ijdsaoijds")."<BR>"; 
echo "Pass3 md5 = ".md5("a")."<BR>"; 
echo "Pass4 md5 = ".md5(" ")."<BR>"; 
?> 

sortie:

Pass1 md5 = dc3a7b42a97a35981059036ef22ad2c1 
Pass2 md5 = df7ca542bdbf7c4b8776cb21c45e7eef 
Pass3 md5 = 0cc175b9c0f1b6a831c399e269772661 
Pass4 md5 = 7215ee9c7d9dc229d2921a40e899ec5f 
+0

Ne semble pas être juste un md5() parce que j'ai vérifié les mots de passe générés dans la base de données et ils ne sont pas 32 caractères. les longueurs vont de 29 à 32 .. – Obay

+0

La sortie Java est clairement fausse, il manque quelques '0'. – bobince

+0

mec, pass1 et pass3 ne sont pas identiques. java's pass1 a supprimé un zéro. java's pass3 a supprimé le premier zéro. – Obay

0

Pour obtenir les mêmes résultats dans les deux java et php j'ai utilisé cela.

Java (assurez-vous d'appeler la méthode dans un "essayer" bloc):

public static String getHash(String pass) throws Exception 
{ 
    MessageDigest md=MessageDigest.getInstance("MD5"); 
    md.update(pass.getBytes(),0,pass.length()); 
    return new BigInteger(1,md.digest()).toString(16); 
} 

PHP:

<?php 
echo md5(pass); 
?> 

Hope this helps

Edit: Si les rendements variant java 31 caractères, ajoute un "0" devant la chaîne pour correspondre au hachage php qui renvoie 32 caractères.

Questions connexes