是否有与Java MessageDigest等效的PHP

时间:2014-03-07 15:51:59

标签: java php encryption sha256

我有一个需要在PHP中实现的Java方法。它是创建一个身份验证字符串以获取对API的访问权限。它由公司提供的代码和API密钥组成,也由公司提供,并且根据下面的Java示例,它还包括自纪元以来几分钟内的GMT时间戳。

根据文档,它说“时间戳计算为自纪元以来经过的分钟数。必须使用GMT时区计算时间戳。如果请求服务器的系统时间超过一分钟实际当前时间,服务器将拒绝该呼叫,其中包含400个错误请求代码“。

我必须提供代码以及我创建的SHA-256加密令牌作为参数。

这是Java:

String createToken() {
    String token = "";

    MessageDigest lclMD = null;
    try {
        lclMD = MessageDigest.getInstance("SHA-256"); }
    catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }

    lclMD.update((EnvConstants.code + EnvConstants.api_key + Long.toString(getEpochMinutes())).getBytes());
    byte[] lclResult = lclMD.digest();

    sig = new String(Hex.encodeHex(lclResult));
    return token; 
}

long getEpochMinutes () {
    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 
    long now = System.currentTimeMillis();

    cal.setTimeInMillis(now);
    return (cal.getTimeInMillis() / 60000L); 
}

这是我在PHP中尝试过的:

$time = (string)time()/60;   // to get the minutes since epoch, I have also tried it not casting it to a string
$code = 'thisisthecode';
$api_key = 'XXXXXXX';
$hash = hash('sha256', $code . $api_key . $time);

$curl = curl_init();
$url = "http://api.url/user/XXXX?code=thisisthecode&token=$hash"; 
curl_setopt($curl, CURLOPT_URL, $url);
$result = curl_exec($curl);
return $result;

当我运行此代码时,我总是收到400 Bad Request错误。

要清楚,我不知道Java,现在我猜我是否认识PHP,因为我无法使用它。

任何人都可以帮我解决这个问题吗?我正在撞击混凝土。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

$ key = openssl_digest($ stringSHA,'sha512',true);