【问题标题】:Function returns wrong result but good result in the debugger with same string parameters函数返回错误结果,但在具有相同字符串参数的调试器中结果良好
【发布时间】:2011-09-20 20:13:27
【问题描述】:

我在生活中见过很多事情,但这对我来说似乎令人难以置信。 其实我是java新手。

我正在尝试设置 oauth 通信。

为此,我需要签署每个请求。 为此,我使用以下函数:

private String computeHmac(String baseString, String key)
{
    Mac mac = null;
    try
    {
        mac = Mac.getInstance("HmacSHA1");
    }
    catch(NoSuchAlgorithmException ex) { } 
    SecretKeySpec secret = null;
    secret = new SecretKeySpec(key.getBytes(), mac.getAlgorithm());

    try
    {
        mac.init(secret);
    }
    catch (InvalidKeyException ex)
    { 
        Log.e(Constants.LOG_TAG, "Invalid key: " + ex.getMessage());
    }
    mac.update(baseString.getBytes());
    byte[] digest = mac.doFinal();
    return Base64.encodeBytes(digest).trim();
}

上面的函数被包装到一个自定义类中,我用于与 oauth 相关的操作。

对于 oauth,我们必须进行两次往返才能与目标 api 通信。

第一次正确生成签名。

第二次生成的签名证明总是错误的,因此我开始调试。该函数有两个输入参数。我在 Eclipse 表达式窗口中创建了两行。一个带有函数调用和字符串变量,第二个带有相同的函数调用和我从变量值复制出来的确切字符串值。

第一个表达式的值与错误签名之前的值相同。

惊喜:第二个表达式的值反映了正确的签名。

WTF???

我不知道java中有什么特殊因素吗?特殊的字符串处理什么的?

【问题讨论】:

  • 至少我迷路了..你能简单解释一下吗?你给这个computeHmac()打了两次电话?与strings 相同/差异?得到相同/不同的结果?
  • 好的简单流程:Oauth oauth = new Oauth();字符串签名 = oauth.computeHmac("GETrequest...", secret); // 返回正确的值 signature = oauth.computeHmac("GETrequest2nd...", secret2); // 返回不正确的值
  • 你怎么说这个值是否“正确”?与否..
  • 服务器告诉它,相同值的正确性在其他平台上测试证明

标签: java android eclipse debugging digital-signature


【解决方案1】:

这是一个不可见的字符,可能是字符串末尾的 \n。 如果有人遇到同样的问题,值得检查一下。 我为此损失了将近一天。

【讨论】:

    猜你喜欢
    • 2018-11-12
    • 2018-05-03
    • 1970-01-01
    • 2012-04-26
    • 2019-09-30
    • 1970-01-01
    • 2018-05-04
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多