Я пытаюсь создать базовое демонстрационное приложение, в котором один класс будет генерировать сообщение для отправки в следующем формате 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
Прежде чем оценивать свой код, вы фактически не сравниваете значения. Если вы печатаете так:
System.out.print("Encoded Context : ");
System.out.println(encodedContext);
Вы просто печатаете тип массива ([B), за которым следует его hashCode. Инициализировать строку с закодированными байтами:
System.out.println(new String(encodedContext, "UTF8"));
Вы также должны рассмотреть возможность использования явной кодировки вместо стандартной по умолчанию (в зависимости от вашей исходной кодировки).
Попробуйте и повторите отправку результатов.