java - Android Base64编码问题上构建Gigya Signature

标签 java encoding base64 signature gigya

您好,我在创建 Gygia 签名时遇到问题。我已经尝试了 this 上的一切帖子,我几乎确定我的问题出在我正在使用的 Base64 上。 这是我现在得到的。

两种方法都给我错误的 key

static String sign(String timestamp, String uid, String key) {
    String baseString = timestamp + "_" + uid;
    String lRet = "";
    byte[] baseBytes;
    try {
        baseBytes = baseString.getBytes("UTF-8");

        byte[] secretKeyBytes = org.apache.commons.codec.binary.Base64
                .decodeBase64(key.getBytes());
        Mac mac = Mac.getInstance("HmacSHA1");
        mac.init(new SecretKeySpec(secretKeyBytes, "HmacSHA1"));
        byte[] signatureBytes = mac.doFinal(baseBytes);
        byte[] encodedSign = org.apache.commons.codec.binary.Base64
                .encodeBase64(signatureBytes);
        lRet = new String(encodedSign, "UTF-8");
    } catch (Exception e) {
        e.printStackTrace();
    }
    return lRet;
}

我尝试过的另一种实现是这个,但我的签名包含“/”和“+”等字符,Gigya 将其踢回原处。

private String constructSignature(String timestamp, String UID, String pKey) {

    // Construct a "base string" for signing
    String baseString = timestamp + "_" + UID;

    // Convert the base string into a binary array
    byte[] binaryBaseString = ConvertUTF8ToBytes(baseString);

    // Convert secretKey from BASE64 to a binary array
    byte[] binaryKey = ConvertFromBase64ToBytes(pKey);

    // Use the HMAC-SHA1 algorithm to calculate the signature
    byte[] binarySignature = hmacsha1(baseString, binaryKey);

    // Convert the signature to a BASE64
    String signature = ConvertToBase64(binarySignature);

    return signature;
}

private byte[] ConvertUTF8ToBytes(String pString) {
    try {
        return pString.getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return null;
}

private byte[] ConvertFromBase64ToBytes(String pBase64String) {
    return android.util.Base64.decode(pBase64String,
            android.util.Base64.DEFAULT);
}

private String ConvertToBase64(byte[] data) {
    String retString = android.util.Base64.encodeToString(data, android.util.Base64.DEFAULT);
    return retString;
}

我对这段代码进行了很多修改,我使用了 commons.codec Base64 以及 Gigya 版本,但没有运气。 任何指示将不胜感激。 问候

我使用错误 key 从 Gigya 返回的错误是:

errorCode:400006
errorMessage:Invalid parameter value
errorDetails:Invalid argument: invalid signature
data:{"statusCode":400,"errorMessage":"Invalid parameter 
value","errorCode":400006,"callId":"0106c32c05e14afba1fc93ae0659bb69",
"errorDetails":"Invalid argument: invalid signature","statusReason":"Bad Request"}

最佳答案

读完这篇文章后I mentioned我在接受的答案中发现 SigUtils类(class)基本上为你完成了所有的工作......花了我一段时间,我希望我没有浪费任何人的时间。生成 key 的方法如下:

String lSig  = SigUtils.getOAuth1Signature(query+"_"+expTime, lHashedKey);

并验证:

boolean valid = SigUtils.validateUserSignature(expTime, query, lHashedKey, lSig);

关于java - Android Base64编码问题上构建Gigya Signature,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18085391/

相关文章:

java - PhantomJS 和 Selenium Webdriver - 如何清除 session

python - 使用 Python 和诱变剂进行 De-mojibaking

python - Flask JSONEncoder 将 ensure_ascii 设置为 False

android - 在 Android 中使用 Base64 编码和解码图像的优缺点

java - 使用 Scala 或 Java 进行 Base 64 编码

linux - 如何将 base64 编码的 torrent info_hash 转换为磁力链接 info_hash? (Linux)

java - getSystemServiceName(...) 调用时出现 NullPointerException

java - 我应该如何在 Android 应用程序中保存应用程序数据?

java - 在 Java 字符串中打印 "

java - 如何让我的 java 程序从文本文件中读取日语(Unicode 编码)?