java - 来自 Java 的 Ruby 中的 HMAC

标签 java ruby string cryptography hmac

我正在尝试在 ruby​​ 中编写以下 java 函数:

public static byte[] hmac_sha1(byte[] keyBytes, byte[] text)
  throws NoSuchAlgorithmException, InvalidKeyException
{
    //        try {
    Mac hmacSha1;
    try {
      hmacSha1 = Mac.getInstance("HmacSHA1");
    } catch (NoSuchAlgorithmException nsae) {
      hmacSha1 = Mac.getInstance("HMAC-SHA-1");
    }
    SecretKeySpec macKey = new SecretKeySpec(keyBytes, "RAW");
    hmacSha1.init(macKey);

    System.out.println("Algorithm [" + macKey.getAlgorithm() + "] key [" + Helper.bytesToString(macKey.getEncoded()) + "]");
    System.out.println("Final text: " + Helper.bytesToString(text));

    byte[] hash =  hmacSha1.doFinal(text);

    System.out.println("Hash: " + Helper.bytesToString(hash));

    return hash;
}

我添加了System.out.println,这是输出:

Algorithm [RAW] key [3132333435363738393031323334353637383930]
Final text: 0000000000000000
Hash: cc93cf18508d94934c64b65d8ba7667fb7cde4b0

现在在 ruby​​ 中我尝试

require 'openssl' 
#    
#   text: 0000000000000000
#   Key bytes: 3132333435363738393031323334353637383930 
#   Wanted hash = cc93cf18508d94934c64b65d8ba7667fb7cde4b0

digest  = OpenSSL::Digest::Digest.new('sha1')
secret = "12345678901234567890"
secret2 = "3132333435363738393031323334353637383930"
text = "0000000000000000"

puts OpenSSL::HMAC.hexdigest(digest, secret, text)
puts OpenSSL::HMAC.hexdigest(digest, secret, "0")
puts OpenSSL::HMAC.hexdigest(digest, secret2, "0")
puts OpenSSL::HMAC.hexdigest(digest, secret2, text)


puts "Wanted hash: cc93cf18508d94934c64b65d8ba7667fb7cde4b0"

没有一个哈希值匹配,我知道这与编码等有关。我如何匹配 java HMAC ?

最佳答案

实际上,我最终使用了来自 commons-codec-1.5.jar 的实用程序类,如下所示:

import org.apache.commons.codec.binary.Hex;
// (...)
Hex.encodeHexString(rawBytes);

关于java - 来自 Java 的 Ruby 中的 HMAC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7128924/

相关文章:

java - 查看 Unix 中的 java 退出代码

java - 多线程时 onClick 随机不被调用

ruby-on-rails - grouped_collection_select 与 I18n

ruby - 覆盖使用#define_singleton_method 定义的实例方法并调用原始方法

c - 当选项是 C 上的字符串时如何使用 getopt?

java - 继续扫描字符串,直到找到字符串的第一次/最后一次出现

java - 如何更好地将丰富的字符串内容和图像保存到数据库中?

Java 8、Base64.Decoder编译

ruby - 计算百分位数 (Ruby)

java - 如何让 Button 右对齐,而不被 TextView 重叠?