簡體   English   中英

如何為SHA256獲取Ruby生成的HMAC,以便安全地匹配Java?

[英]How to get Ruby generated HMAC for SHA256 that is url safe to match Java?

我有一個運行一些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!(/=+$/, "")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM