我在Android上遇到一些HMAC的问题。我正在将SHA1算法与以下代码一起使用,该代码在搜索android hmac-sha1时会在网上显示。
String base_string = "This is a test string";
String key = "testKey";
try {
Mac mac = Mac.getInstance("HmacSHA1");
SecretKeySpec secret = new SecretKeySpec(key.getBytes("UTF-8"), mac.getAlgorithm());
mac.init(secret);
byte[] digest = mac.doFinal(base_string.getBytes());
String enc = new String(digest);
// Base 64 Encode the results
String retVal = Base64.encodeBase64String(enc.getBytes());
Log.v(TAG, "String: " + base_string);
Log.v(TAG, "key: " + key);
Log.v(TAG, "result: " + retVal);
} catch (Exception e) {
System.out.println(e.getMessage());
}
为了测试此代码,我用它创建了一个简单的标准Java程序(用System.out.println调用替换了Log.v调用),因此我可以将其与android版本进行比较。在这两种情况下,我对base_string和key使用相同的测试值。
此外,我还使用一些PHP函数和一个验证服务器(使用了一些OAuth令牌)验证了标准Java的编码结果。该代码在标准Java程序中可以正常工作,但在Android程序中则无法工作。我进行了很多搜索,无法找出问题所在。任何人都经历过吗?
这是标准Java和android的结果...
fH/+pz0J5XcPZH/d608zGSn7FKA=
fH/vv73vv709Ce+/vXcPZH/vv73vv71PMxkp77+9FO+/vQ==
进一步研究它,我确定它是hmac函数而不是Base64编码,因为比较这些hmac值时,Android版本与Java程序相比具有各种额外的空格和其他未知字符符号。
任何帮助表示赞赏!
参考方案
我想这是一个字符串编码问题。
你在这里做什么?
String enc = new String(digest);
// Base 64 Encode the results
String retVal = Base64.encodeBase64String(enc.getBytes());
您将字节转换为字符串,然后再次返回字节数组(然后进行base-64编码)。
相反,请执行以下操作:
String retVal = Base64.encodeBase64String(digest);
通常,如果您要使用可移植程序,则永远不要使用String.getBytes()
或new String(byte[])
。并且永远不要尝试将任意字节数组(之前不是字符串)转换为字符串(类似于Base64的字符串)。
我有一个可以通过https调用网络服务的应用程序。当我在手机上运行apk时,效果很好。但是,在模拟器中,所有通过POST的SSL请求均失败,并显示以下信息: 读取错误:ssl = 0xb402be00:SSL库失败,通常是一个协议 错误 错误:100c50bf:SSL例程:ssl3_read_bytes:NO_RENEGOTIATION(外部/无聊的sl /…
绑定Java库Xamarin.Android - java我花了两天时间在每个论坛,文档,tuto,博客等上寻找答案。我为实习生启动了一个Android应用程序,因为我不懂Java,所以用xamarin C#开发了它。直到最近一切都还不错,但现在我需要集成一个SDK才能在应用程序中使用POS(销售点),但是该库是用Java编写的,即使跟随文档或辅导老师,我也无法将其与xamarin绑定(我什至无法调试)。这里有人已…
首先关注EditText清晰文本-Android - javaIt's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current fo…
在Android中以编程方式从启动器中删除应用程序 - java有没有一种方法可以在运行时从家庭启动器中删除活动?我的意思是从其属性或类似内容中删除Intent.CATEGORY_LAUNCHER。 参考方案 您可以通过PackageManager#setComponentEnabledSetting()禁用组件,这将具有将其从启动器中删除的作用。
是否曾经调用过onUpgrade方法? - java是否曾经调用过 onUpgrade 的 SQLiteOpenHelper 方法?如果是这样,什么时候调用它?如果开发人员未调用它,为什么会出现在其中?该功能真正发生了什么?我已经看到了删除所有表的示例,但是有一条评论说删除所有表不是您应该做的。有什么建议? 参考方案 当您构造一个比打开的数据库版本新的SQLiteOpenHelper时,将调用它。做什么取决于…