【问题标题】:Convert HMAC-SHA256 function from Java to Ruby将 HMAC-SHA256 函数从 Java 转换为 Ruby
【发布时间】:2013-12-22 10:28:46
【问题描述】:

我正在尝试将此哈希函数从 Java 转换为 Ruby。

Java 代码:

  Mac localMac = "HMAC-SHA256";
  String str1 = "a4d1b77bbb1a4a5ca695ad72c84b77e5";
  localMac.init(new SecretKeySpec(str1.getBytes("UTF-8"), localMac.getAlgorithm()));
  byte[] arrayOfByte = localMac.doFinal("{"_uid":"3396112","_csrftoken":"a23482932482sdsf4428","media_id":"616150302791211280_187036957"}");
  BigInteger localBigInteger = new BigInteger(1, arrayOfByte);
  String str3 = String.format("%0" + (arrayOfByte.length << 1) + "x", new Object[] { localBigInteger });
  return str3;

Ruby 代码:

require 'openssl'
require 'base64'

secret = "a4d1b77bbb1a4a5ca695ad72c84b77e5"
digest = OpenSSL::Digest::Digest.new('sha256')
hash  = OpenSSL::HMAC.hexdigest(digest, secret,'{"_uid":"3396112","_csrftoken":"a23482932482sdsf4428","media_id":"616150302791211280_187036957"}')
p hash

由于某种原因,哈希值永远不会相同。有什么帮助吗?

【问题讨论】:

  • Mac localMac = "HMAC-SHA256"; - 您不能将String 分配给Mac 类型的变量。还有localMac.doFinal("{"_uid":"3396112","_csrftoken":"a23482932482sdsf4428","media_id":"616150302791211280_187036957"}");?你能发布一些真实的代码吗?

标签: java ruby hmac sha256


【解决方案1】:

你可以这样做

public static void main(String[] args) {
  String str1 = "a4d1b77bbb1a4a5ca695ad72c84b77e5";
  byte[] keyBytes = str1.getBytes();
  SecretKeySpec localMac = new SecretKeySpec(
      keyBytes, "HmacSHA256");
  final String inputStr = "{\"_uid\":\"3396112\",\"_csrftoken\":"
      + "\"a23482932482sdsf4428\","
      + "\"media_id\":\"616150302791211280_187036957\"}";
  try {
    Mac mac = Mac.getInstance("HmacSHA256");
    mac.init(localMac);
    // Compute the hmac on input data bytes
    byte[] arrayOfByte = mac.doFinal(inputStr
        .getBytes());
    BigInteger localBigInteger = new BigInteger(1,
        arrayOfByte);
    String str3 = String.format("%0"
        + (arrayOfByte.length << 1) + "x",
        new Object[] { localBigInteger });
    System.out.println(str3);
  } catch (InvalidKeyException e) {
    e.printStackTrace();
  } catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
  } catch (IllegalStateException e) {
    e.printStackTrace();
  }
}

这将输出e48d690dc6825e8f2895845be112fb1e5ee22f5283f2243512d6cca2714e8b35

$ cat test.rb
#!/usr/bin/env ruby

require 'openssl'
require 'base64'

secret = "a4d1b77bbb1a4a5ca695ad72c84b77e5"
digest = OpenSSL::Digest::Digest.new('sha256')
hash  = OpenSSL::HMAC.hexdigest(digest, secret,'{"_uid":"3396112","_csrftoken":"a23482932482sdsf4428","media_id":"616150302791211280_187036957    "}')
p hash
$ ./test.rb
"e48d690dc6825e8f2895845be112fb1e5ee22f5283f2243512d6cca2714e8b35"

【讨论】:

    猜你喜欢
    • 2015-11-13
    • 2021-08-28
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多