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