如何获取字符串的字节?

时间:2018-07-18 10:43:01

标签: java php legacy password-hash ofbiz

背景故事

我们被要求重新创建旧系统(从Java到PHP,即Laravel),但是有人强调,我们需要将所有旧用户移植到新系统。旧系统正在使用Ofbiz(也是一个非常旧的版本)。

问题

旧系统正在使用过时的哈希算法。

我已经在Ofbiz代码库中进行了搜索,以找到哈希类并找到以下函数:

HashCrypt.java

public static String cryptPassword(String hashType, String password) {
    int saltLength = new Random().nextInt(15) + 1;
    return cryptPassword(hashType, RandomStringUtils.random(saltLength, CRYPT_CHAR_SET), password);
}

public static String cryptPassword(String hashType, String salt, String password) {
    StringBuilder sb = new StringBuilder();
    sb.append("$").append(hashType).append("$").append(salt).append("$");
    sb.append(getCrypted(hashType, salt, password));
    return sb.toString();
}

private static String getCrypted(String hashType, String salt, String password) {
    try {
        MessageDigest messagedigest = MessageDigest.getInstance(hashType);
        messagedigest.update(salt.getBytes("UTF-8"));
        messagedigest.update(password.getBytes("UTF-8"));
        return Base64.encodeBase64URLSafeString(messagedigest.digest()).replace('+', '.');
    } catch (NoSuchAlgorithmException e) {
        throw new GeneralRuntimeException("Error while comparing password", e);
    } catch (UnsupportedEncodingException e) {
        throw new GeneralRuntimeException("Error while comparing password", e);
    }
}

我已经重新创建了所有内容:

sb.append(getCrypted(hashType, salt, password));

但是,在PHP中没有任何问题,我对调用getCrypted时感到困惑。它运行以下两个片段:

messagedigest.update(salt.getBytes("UTF-8"));
messagedigest.update(password.getBytes("UTF-8"));

我已经进行了一些基本的调试,并注意到对getBytes进行盐值更改后,例如:

盐({{1}前): DP1OpoA

盐(帖子getBytes [B @ 5338f526

这意味着除非在PHP中可以找到等效的getBytes,否则我将无法重新创建它。

以下是到目前为止的PHP类:

OfbizPassword.php

getBytes

所以,我的问题是,是否有与class OfbizPassword { const HASH_TYPE = 'sha1'; const HASH_APPEND = 'SHA'; public static function hash($password, $salt = '') { if (empty($salt)) $salt = self::random_str(random_int(1, 15)); $hash = '$' . self::HASH_APPEND; $hash .= '$' . $salt; } private static function random_str($length, $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') { $pieces = []; $max = mb_strlen($keyspace, '8bit') - 1; for ($i = 0; $i < $length; ++$i) { $pieces[] = $keyspace[random_int(0, $max)]; } return implode('', $pieces); } private static function base64_url_encode($input) { return strtr(base64_encode($input), '+/=', '._-'); } private static function base64_url_decode($input) { return base64_decode(strtr($input, '._-', '+/=')); } } 等效的示例,以获得与上述盐相同的输出示例?

我不是Java开发人员,所以请忍受。

0 个答案:

没有答案