HMAC в Ruby от Java - PullRequest
       15

HMAC в Ruby от Java

0 голосов
/ 20 августа 2011

Я пытаюсь записать следующую функцию Java в ruby:

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?

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

На самом деле я использовал служебный класс из commons-codec-1.5.jar следующим образом:

import org.apache.commons.codec.binary.Hex;
// (...)
Hex.encodeHexString(rawBytes);
0 голосов
/ 21 августа 2011

Java-код:


import java.io.IOException;
import java.io.File;
import java.io.DataInputStream;
import java.io.FileInputStream ;
import java.lang.reflect.UndeclaredThrowableException;

import java.security.GeneralSecurityException;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

public class Stack
{
    public static String hashToHexString(byte[] hash)
    {
    StringBuffer hexString = new StringBuffer();
    for (int i = 0; i  0) {
            hexString.append('0');
        }
        hexString.append(hexByte);
    }
        return hexString.toString();
    }

    public static void main(String[] args)
      throws NoSuchAlgorithmException, InvalidKeyException

    {

        String secret = "12345678901234567890";
        byte[] keyBytes = secret.getBytes();
        String movingFact = "0";
        byte[] text = movingFact.getBytes();

        Mac hmacSha1;
        try {
          hmacSha1 = Mac.getInstance("HmacSHA1");
        } catch (Exception nsae) {
          hmacSha1 = Mac.getInstance("HMAC-SHA-1");         
        }
        SecretKeySpec macKey = new SecretKeySpec(keyBytes, "RAW");
        hmacSha1.init(macKey);
        byte[] hash =  hmacSha1.doFinal(text);
        String hexString = hashToHexString(hash);
        System.out.println(hexString);
    }
}

код рубина:


require 'openssl'

digest  = OpenSSL::Digest::Digest.new('sha1')
secret = "12345678901234567890"
movingFactor = "0"
hash = OpenSSL::HMAC.hexdigest(digest, secret, movingFactor)
puts "Hash: #{hash}" 

Выход: Java:

DANIELs-MacBook-Air:del dani$ javac Stack.java 
DANIELs-MacBook-Air:del dani$ java Stack
32a67f374525d32d0ce13e3db42b5b4a3f370cce

Ruby:

DANIELs-MacBook-Air:del dani$ ruby Stack.rb
Hash: 32a67f374525d32d0ce13e3db42b5b4a3f370cce

Готово, проблема была в том, что java-версия не была правильно переведена в шестнадцатеричные строки.

...