mva*_*ley 11 ruby java sha256 hmac
我有一个运行一些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)
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
产量
红宝石:
Encoded (Url Safe): QgYLqGm1M4qozdEjGC_CnJ8CdBm2jQpsU85kSWFcjKM=
Encoded : QgYLqGm1M4qozdEjGC/CnJ8CdBm2jQpsU85kSWFcjKM=
Run Code Online (Sandbox Code Playgroud)
Java的:
Encoded (Url Safe): QgYLqGm1M4qozdEjGC_CnJ8CdBm2jQpsU85kSWFcjKM
Encoded : QgYLqGm1M4qozdEjGC/CnJ8CdBm2jQpsU85kSWFcjKM=
Run Code Online (Sandbox Code Playgroud)
Ruby不会删除尾随的'=' - 这不是绝对的要求,因为您可以在RFC 4648中读到它只是声明在某些应用程序中可能需要删除它们.但除此之外,保证Ruby的URL安全编码与Java完全相同.
所以你要做的唯一事情是去掉尾随的'==',你可以使用正则表达式:
encoded_url_safe_.gsub!(/=+$/, "")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7138 次 |
| 最近记录: |