当前位置: 首页 > 面试题库 >

如何获得URL可以安全匹配Java的Ruby生成的SHA256的HMAC?

融渊
2023-03-14
问题内容

我有一个运行一些Java代码的tomcat服务器,该代码允许用户使用API​​密钥进行身份验证。该请求使用使用SHA256创建的HMAC。我有一个用于请求的Ruby客户端,由于我是加密新手,因此很难获取它来生成匹配的HMAC。我试过不使其URL安全,并且匹配。因此,我真的很想知道如何才能使Ruby客户端与URL安全版本匹配(因为我无法更改Java代码)。最后只是一个多余的=字符。在此先感谢您的帮助。

对于Ruby,我使用1.9.3;对于Java,我使用6u31,以及来自Apache的commons-codec-1.6.jar库。

红宝石:

require "openssl"
require "base64"

json_str = "{'community':'LG7B734A', 'login_id':'user1', 'time':'1331928899'}"
digest = OpenSSL::Digest::Digest.new("sha256")
key = [ "4cc45e4258121c3fec84147673e1bd88e51b1c177aafcfa2da72bd4655c9f933" ]
hmac = OpenSSL::HMAC.digest(digest, key.pack("H*"), json_str)

encoded_url_safe = Base64.urlsafe_encode64(hmac)
encoded = Base64.encode64(hmac)

puts("Encoded (Url Safe): " + encoded_url_safe)
puts("Encoded           : " + encoded)

Java:

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;

import javax.crypto.spec.SecretKeySpec;
import javax.crypto.Mac;

public class ExampleHMAC
{
    public static void main(String[] args) throws Exception
    {
        String key = "4cc45e4258121c3fec84147673e1bd88e51b1c177aafcfa2da72bd4655c9f933";
        byte[] keyBytes = Hex.decodeHex(key.toCharArray());

        SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "HmacSHA256");
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(keySpec);

        String jsonStr = "{'community':'LG7B734A', 'login_id':'user1', 'time':'1331928899'}";
        byte[] hmacBytes = mac.doFinal(jsonStr.getBytes());

        String encodedUrlSafe = Base64.encodeBase64URLSafeString(hmacBytes);
        String encoded = Base64.encodeBase64String(hmacBytes);

        System.out.println("Encoded (Url Safe): " + encodedUrlSafe);
        System.out.println("Encoded           : " + encoded);
    }
}

输出量

红宝石:

Encoded (Url Safe): QgYLqGm1M4qozdEjGC_CnJ8CdBm2jQpsU85kSWFcjKM=
Encoded           : QgYLqGm1M4qozdEjGC/CnJ8CdBm2jQpsU85kSWFcjKM=

Java:

Encoded (Url Safe): QgYLqGm1M4qozdEjGC_CnJ8CdBm2jQpsU85kSWFcjKM
Encoded           : QgYLqGm1M4qozdEjGC/CnJ8CdBm2jQpsU85kSWFcjKM=

问题答案:

Ruby不会删除结尾的’=’-这不是绝对要求,正如您可以在RFC
4648中
阅读的那样,它只是声明在某些应用程序中可能希望删除它们。但是除此之外,还可以保证Ruby的URL安全编码与Java完全相同。

因此,您唯一要做的就是删除尾随的’==’,例如,可以使用正则表达式:

encoded_url_safe_.gsub!(/=+$/, "")


 类似资料:
  • 我正在将一个web应用程序从Ruby移植到Java,并希望允许用户在不重置密码的情况下登录。下面是使用pbkdf2 gem生成哈希的Ruby代码: 读取Ruby gem的源代码时,它使用openssl::digest.new(“sha256”)作为默认散列函数,并生成一个32字节的值,该值使用“unpack(”h*“)”转换为一个64字符串。 所以,在Java,我尝试了以下几种方法: 使用pass

  • 可以为url使用可选参数吗?例如,如果未传递参数,则路径将匹配相同的组件; 在实现它的时候,我需要声明两个路由和来匹配同一个组件。

  • 问题内容: 在使用正则表达式时,我使用RegexBuddy。我从其库中复制了正则表达式以匹配URL。我在RegexBuddy中成功测试。但是,当我将其复制为Java 样式并将其粘贴到Java代码中时,它将无法正常工作。以下类打印: 有人知道我在做什么错吗? 问题答案: 请尝试以下正则表达式字符串。你的测试可能以区分大小写的方式进行。我添加了小写字母Alpha以及正确的字符串开头占位符。 这也适用:

  • 我正在使用iReport Designer生成报表,这些报表以PDF形式导出。已要求确保报告不被复制文本、编辑等。如何在iReport本身中或使用jasperreports库包来完成此操作?

  • 我对从有序对象列表中获取子列表的Y方法感兴趣。子列表应该以一个对象开始,该对象匹配一个与它的属性相关的给定条件,它应该以一个对象匹配一个不同的条件结束。 假设我有以下类: 我需要从(包括)到(包括)的子列表,保持它在源列表中的顺序,将放在一边。 我知道如何在不使用流的情况下做到这一点(比如查找开始和结束的索引,然后将元素从index获取到index),这可能已经足够了,但有些过时,不能真正满足我对