【问题标题】:Is there a PHP equivalent to Java MessageDigest是否有与 Java MessageDigest 等效的 PHP
【发布时间】:2019-10-23 11:33:08
【问题描述】:

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

根据文档,它说“时间戳计算为自纪元以来经过的分钟数。必须使用 GMT 时区来计算时间戳。如果请求服务器的系统时间从实际当前时间,调用将被服务器拒绝,并带有 400 Bad Request code"。

我必须提供代码以及我创建的 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,因为我无法让它工作。

谁能帮我解决这个问题?我正用头撞混凝土。

感谢您的所有帮助。

【问题讨论】:

  • $SHA = openssl_digest($stringSHA, 'sha512');但我不确定你在找什么,但这会将字符串转换为 sha512..
  • 谢谢迪特。我希望准确复制 PHP 中 Java 示例返回的内容
  • 对您的问题有用吗? stackoverflow.com/questions/44963287/…

标签: java php encryption sha256


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-01-18
    • 1970-01-01
    • 2011-03-03
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    相关资源
    最近更新 更多