【发布时间】: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