我有一个运行一些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=
Encoded (Url Safe): QgYLqGm1M4qozdEjGC_CnJ8CdBm2jQpsU85kSWFcjKM Encoded : QgYLqGm1M4qozdEjGC/CnJ8CdBm2jQpsU85kSWFcjKM=
Ruby不会删除结尾的’=’-这不是绝对要求,正如您可以在RFC 4648中阅读的那样,它只是声明在某些应用程序中可能希望删除它们。但是除此之外,还可以保证Ruby的URL安全编码与Java完全相同。
因此,您唯一要做的就是删除尾随的’==’,例如,可以使用正则表达式:
encoded_url_safe_.gsub!(/=+$/, "")