Коды аутентификации сообщений на основе хэширования (MAC) не совпадают на стороне получателя

1

Я пытаюсь создать базовое демонстрационное приложение, в котором один класс будет генерировать сообщение для отправки в следующем формате SignedMessage_using_HMAC.BASE64encoded_message

На принимающей стороне (DecodeData.java) сначала я захотел сравнить, было ли сообщение подписано с использованием правого ключа, дешифруя подписанное сообщение, а затем подписав сообщение с тем же ключом, а затем сравните подписанное сообщение в конце получателя подписанное сообщение послал. Но это не работает.

Когда я пытаюсь декодировать кодированное в Base64 сообщение, оно не дает мне правильного сообщения.

Может ли кто-нибудь, пожалуйста, направить меня, что здесь не так?

import org.apache.commons.codec.binary.Base64;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class EncodeData {

public static void main(String[] args) throws Exception {
    String myAppContext = "abc123def";
    String consumerSecret = "959595";
    String algorithm = "HMACSHA256";
    byte[] encodedContext;

    // Base64 encoded context;
    encodedContext = new Base64(true).encode(myAppContext.getBytes());
    System.out.print("Encoded Context : ");
    System.out.println(encodedContext);

    //Generate Signed context           
    SecretKey hmacKey = new SecretKeySpec(consumerSecret.getBytes(), algorithm);
    Mac mac = Mac.getInstance(algorithm);
    mac.init(hmacKey);

    byte[] digest = mac.doFinal(myAppContext.getBytes());       
    System.out.print("Created digest : ");
    System.out.println(digest);

    // Signed Based64 context and Base64 encoded context        
    String messageToSend = digest.toString() + "." + encodedContext.toString();
    System.out.println(messageToSend);
}   
}

import org.apache.commons.codec.binary.Base64;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Arrays;

public class DecodeData {

public static void main(String[] args) throws Exception {
    byte[] myAppContext;
    String consumerSecret = "959595";
    String algorithm = "HMACSHA256";
    String messageRecieved = args[0];
    byte[] singedDecodedContext;

    String recievedDigest = messageRecieved.split("[.]", 2)[0];             
    String encodedContext = messageRecieved.split("[.]", 2)[1];
    myAppContext = new Base64(true).decode(encodedContext);
    System.out.print("Decrypted message : ");
    System.out.println(myAppContext);

    //Check if the message is sent by the correct sender by signing the context and matching with signed context
    SecretKey hmacKey = new SecretKeySpec(consumerSecret.getBytes(), algorithm);
    Mac mac = Mac.getInstance(algorithm);
    mac.init(hmacKey);      
    byte[] digest = mac.doFinal(myAppContext);

    System.out.print("Created digest : ");
    System.out.println(digest);

    if (Arrays.equals(digest, recievedDigest.getBytes())) {
        System.out.println("Message was not tempered and was sent by the correct sender");
    } else {
        System.out.println("Message was tempered or was not sent by the corrrect sender");
    }   
}   
}

Вывод

Вывод EncodeData.java C:\Users\vivek.patel\Desktop\API\java\encoding> java -cp commons-codec-1.10.jar ;. EncodeData Encoded Context: [B @510bfe2c Созданный дайджест: [B @73f025cb [B @73f025cb. [B @510bfe2c

Вывод DecodeData.java C:\Users\vivek.patel\Desktop\API\java\encoding> java -cp commons-codec- 1.10.jar ;. DecodeData [B @73f025cb. [B @510bfe2c

Decrypted message : [B@6726a408
Created digest : [B@7168bd8b
Message was tempered or was not sent by the correct sender
Теги:
encryption
hmac

1 ответ

0
Лучший ответ

Прежде чем оценивать свой код, вы фактически не сравниваете значения. Если вы печатаете так:

System.out.print("Encoded Context : ");
System.out.println(encodedContext);

Вы просто печатаете тип массива ([B), за которым следует его hashCode. Инициализировать строку с закодированными байтами:

System.out.println(new String(encodedContext, "UTF8"));

Вы также должны рассмотреть возможность использования явной кодировки вместо стандартной по умолчанию (в зависимости от вашей исходной кодировки).

Попробуйте и повторите отправку результатов.

  • 0
    Привет exoddus, Спасибо за ваш комментарий, я обновил код и теперь вывод ---------- Выходные данные EncodeData.java C: \ Users \ vivek.patel \ Desktop \ API \ java \ encoding> java -cp commons-codec-1.10.jar ;. EncodeData Кодированный контекст: YWJjMTIzZGVm Создан дайджест: [B @ 73f025cb [[email protected] Вывод файла DecodeData.java C: \ Users \ vivek.patel \ Desktop \ API \ java \ encoding> java -cp 1. Commons-code ;. DecodeData [[email protected] Расшифрованное сообщение: abc123def Создан дайджест: [B @ 6da13047 Сообщение было закалено или не было отправлено соответствующим отправителем -------------
  • 0
    как я могу опубликовать свой код снова? У меня нет возможности опубликовать код.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню