Cero final adicional (o cero faltante) Java/PHP

Antecedentes

Estoy trabajando en un complemento Bukkit (lado del servidor de Minecraft). El complemento permite que los jugadores se envíen mensajes entre sí. Estoy trabajando en una interfaz web también. Para ver su "bandeja de entrada", primero deben iniciar sesión con una contraseña que pueden establecer en el juego.

Esta contraseña no se almacena sin formato, se convierte en una cadena larga de valores Unicode, luego se divide en partes, cada una convertida a hexadecimal y se agrega a una cadena diferente.

Versión de Java

//This isn't the best method, I know, but it's still going to take a genius to crack it.
//The resulting number (before somewhat converted to hex) is really
//long, there isn't an easy way of knowing the sequence of characters.
//This conversion is much different than straight up converting to hex,
//as PHP has certain limitations
public static String encodePassword(String password) {
    String longNumber = "";
    for(int i = 0; i < password.length(); i++) {
        longNumber += ((int) password.charAt(i));
    }
    //System.out.println("long = " + longNumber);
    String result = "";
    int splitLength = 5;
    int iterations = longNumber.length() / splitLength;
    if(longNumber.length() % splitLength > 0)
        iterations++;
    for(int i = 0; i < iterations; i++) {
        //System.out.println(result);
        int start = splitLength * i;
        if(longNumber.length() - start <= splitLength) {
            String sub = longNumber.substring(start);
            result += Integer.toHexString(Integer.parseInt(sub));
            continue;
        }
        String sub = longNumber.substring(start, start + splitLength);
        result += Integer.toHexString(Integer.parseInt(sub));
    }
    return result;
}

versión de PHP

function encodePassword($pw){
    $unicode = "";
    for($i=0; $i<strlen($pw); $i++){
        $char = $pw{$i};
        $val = unicode_value($char);
        $unicode = $unicode.$val;
    }
    $result = "";
    $splitLength = 5;
    $iterations = strlen($unicode) / $splitLength;
    if(strlen($unicode) % $splitLength > 0)
        $iterations++;
    for($i = 0; $i < $iterations; $i++) {
        $start = $splitLength * $i;
        if(strlen($unicode) - $start <= $splitLength) {
            $sub = substr($unicode, $start);
            $result = $result.base_convert($sub, 10, 16);
            continue;
        }
        $sub = substr($unicode, $start, $splitLength);
        $result = $result.base_convert($sub, 10, 16);
    }
    return $result;
}

Si 'codifico' la contraseña "partychat" (el nombre del complemento, también tiene una función de chat grupal) obtengo 2c212c93ef23163a91bcc en Java, y 2c212c93ef23163a91bcc0 (igual excepto por el 0 final) en PHP. ¿Algo que esté haciendo mal?

Nota: Esto no siempre sucede, la mayoría de la 'codificación' funciona bien, pero por alguna razón, este caso ocurre a veces

preguntado el 10 de septiembre de 13 a las 01:09

¿Por qué no usar un algoritmo común como md5 o sha, que se comporta igual en Java y PHP? -

No hagas eso. Debe utilizar una criptografía comprobada función hash; a saber, PBKDFv2 o bcrypt. -

@amenadiel: Ninguno de esos hashes es seguro. -

Utilicé hash originalmente (sí, sé que md5 y sha1 no quieres usar, léelo ya), pero por alguna razón no coincidieron:

1 Respuestas

¿Por qué quieres esto? Simplemente usaría un hash de la contraseña de usuario como: Esta pregunta de stackoverflow sobre SHA-256, sé que no está resolviendo su problema, pero es mucho más seguro no inventar su propio estándar de cifrado :)

contestado el 23 de mayo de 17 a las 11:05

De hecho, nunca pensé en hacer que Java hiciera el hash, originalmente hice que la consulta SQL hiciera el hash, y luego verifiqué eso con PHP... Pero por alguna razón no coincidieron. Intentaré codificar la cadena en Java y veré si eso ayuda. KILL3RTACO

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.