如何将Mac转换为字符串?

5

我该如何将MAC数据类型转换为字符串?我可以使用base64将SecretKey数据类型编码为字符串,但对于MAC来说这行不通。

// Generate a secret MAC key

KeyGenerator kg = KeyGenerator.getInstance("HmacSHA1");  
SecretKey key = kg.generateKey();
String encodedkey=Base64.getEncoder().encodeToString(key.getEncoded());


// Create and initialize a MAC with the key
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(key);

// Print the key

System.out.println("Key:" + encodedkey);

// Print out the resulting MAC

System.out.println("MAC:" + mac);

我的输出

Key:lnGahJHeKDqMG+c/K8OHx9HiQQl+aqhCNb0QtnDAdhzE3Xs7gP0uXf93ESO9Demrnl0XFCqHVUBsU9oppkmgVQ==
MAC:javax.crypto.Mac@1ce92674

期望的样本输出

Key: lqC5SNoKYPnQRVFxTp2YhvBQpWiZU7sWTjziVXgMmcFkxvBJQA81PoTqrvscOyj05pvm6MBtlvP6gkqJvisiNQ==
MAC: xca73kbvEEZBKwb0aWMhGA==
2个回答

27

Mac类本身不是数据 - 它保存数据并在调用updatedoFinal时更新数据。

目前您只使用密钥调用了init方法 - 然后需要调用update(可选)和doFinal。当您调用doFinal时,它将返回实际哈希的byte[]。目前我们看不到您想要哈希的任何数据,但您的示例将更改为:

Mac mac = Mac.getInstance("HmacSHA1");
mac.init(key);
mac.update(data1);
mac.update(data2);
mac.update(data3);
// Etc...
byte[] hash = mac.doFinal();
String base64Hash = Base64.getEncoder().encodeToString(hash);

如果您只有一个数据需要进行哈希,您也可以调用doFinal方法 - 这意味着您根本不需要调用update方法:

Mac mac = Mac.getInstance("HmacSHA1");
mac.init(key);
byte[] hash = mac.doFinal(data);
String base64Hash = Base64.getEncoder().encodeToString(hash);

-1

HmacSHA1是哈希函数,这意味着它只能单向工作,您无法从中获取原始值。您需要使用可逆算法。


2
我认为楼主并不是想要一个原始值 - 但他们目前没有提供任何数据进行哈希处理。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接