根据秘密java验证哈希签名

根据秘密java验证哈希签名,java,facebook-oauth,Java,Facebook Oauth,我正在尝试将下面的php代码转换为java。我很难比较散列。有人能帮忙吗。谢谢 例子来自这里 $secret=“appsecret”//在此处使用你的应用程序机密 //解码数据 $sig=base64\u url\u decode($encoded\u sig); $data=json_decode(base64_url_decode($payload),true); //确认签名 $expected_sig=hash_hmac('sha256',$payload,$secret,$raw=tr

我正在尝试将下面的php代码转换为java。我很难比较散列。有人能帮忙吗。谢谢

例子来自这里

$secret=“appsecret”//在此处使用你的应用程序机密
//解码数据
$sig=base64\u url\u decode($encoded\u sig);
$data=json_decode(base64_url_decode($payload),true);
//确认签名
$expected_sig=hash_hmac('sha256',$payload,$secret,$raw=true);
如果($sig!==$expected\u sig){
到目前为止我所得到的

String secret=“somesecret”;
String signedRequest=“some.signedRequest”;
String[]encoded=signedRequest.split(“\\”);
System.out.println(编码为[0]);
System.out.println(编码[1]);
字符串签名=base64UrlDecode(编码[0]);
字符串有效负载=base64UrlDecode(编码[1]);
公共静态字符串base64UrlDecode(字符串输入){
字符串结果=null;
Base64解码器=新的Base64(true);
字节[]decodedBytes=解码器。解码(输入);
结果=新字符串(解码字节);
返回结果;
}
从这里开始,我不知所措


我不知道如何设置散列以与我的签名进行比较。

从中获得一些想法,这对我很有用

import org.apache.commons.codec.binary.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

private JSONObject parseFBSignedRequest(String signedRequest, String secret) throws UnsupportedEncodingException, Exception {


    //split request into signature and data
    String[] signedRequests = signedRequest.split("\\.", 2);
    //parse signature
    String sig = signedRequests[0];

    //parse data and convert to json object
    String data = signedRequests[1];

    //I assumed it is UTF8
    JSONObject jsonData = new JSONObject(new String(Base64.decodeBase64(data), "UTF-8"));
    //check signature algorithm
    if(!jsonData.getString("algorithm").equals("HMAC-SHA256")) {
        //unknown algorithm is used
        return null;
    }

    //check if data is signed correctly
    if(!hmacSHA256(signedRequests[1], secret).equals(sig)) {
        //signature is not correct, possibly the data was tampered with
        return null;
    }
    return jsonData;

}

//HmacSHA256 implementation 
private String hmacSHA256(String data, String key) throws Exception {
    SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
    Mac mac = Mac.getInstance("HmacSHA256");
    mac.init(secretKey);
    byte[] hmacData = mac.doFinal(data.getBytes("UTF-8"));
    return new String(Base64.encodeBase64URLSafe(hmacData), "UTF-8");
}

你能更具体地说明你在这里遗漏了什么吗?我遗漏了这个部分$expected\u sig=hash\u hmac('sha256',$payload,$secret,$raw=true);if($sig!=$expected\u sig){我看到了那篇文章,它对我没有帮助。如果它包含答案,那么我想我不理解。你需要更具体地说明你不理解的内容,而不仅仅是说你不理解。但是,正如你所知,第一段代码(带有所有美元符号的代码)这不是Java,而是PHP。你链接到的网站甚至这样说:“这是一个PHP示例。”如果你在PHP之前阅读,我会说我需要将代码转换成Java。我开始转换,但解码后我不知所措。我不知道如何比较它们。谢谢,我现在正在研究。这意味着什么?!jsonData.getString(“算法”).equals(“HMAC-SHA256”)以检查signedRequest是否使用HMAC-SHA256加密。谢谢,工作正常。欢迎使用:)。很高兴提供帮助。