Android HMAC-SHA1与标准Java HMAC-SHA1不同 - java

我在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的结果...

  • Java(和PHP):fH/+pz0J5XcPZH/d608zGSn7FKA=
  • Android程序: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的字符串)。

    android-android studio模拟器中的SSL问题,在手机上可以正常工作 - java

    我有一个可以通过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 - java

    It'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时,将调用它。做什么取决于…