我们被要求重新创建旧系统(从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开发人员,所以请忍受。