Reputation: 4981
I need to calculate a SHA-256 hash of a string with a secret key. I found this code :
public String computeHash(String input)
throws NoSuchAlgorithmException, UnsupportedEncodingException
{
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.reset();
byte[] byteData = digest.digest(input.getBytes("UTF-8"));
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
for calculating the hash without the secret key. How can I calculate with a secret key? I searched but I didn't find any solution in Android. Any idea ?
Upvotes: 6
Views: 29311
Reputation: 1
In kotlin, use below function.
import java.security.MessageDigest
import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
fun String.hmacSha256(key: String): String {
val secretKey = SecretKeySpec(key.toByteArray(Charsets.UTF_8), "HmacSHA256")
val mac = Mac.getInstance("HmacSHA256")
mac.init(secretKey)
val hash = mac.doFinal(this.toByteArray(Charsets.UTF_8))
return hash.joinToString("") { "%02x".format(it) }
}
Here,
val key = "secret key"
val message = "message to be encrypted"
val encryptedMessage = message.hmacSha256(key) // final result
Upvotes: 0
Reputation: 934
Use the below code,
/**
* Returns a hexadecimal encoded SHA-256 hash for the input String.
* @param data
* @return
*/
private static String getSHA256Hash(String data) {
String result = null;
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(data.getBytes("UTF-8"));
return bytesToHex(hash); // make it printable
}catch(Exception ex) {
ex.printStackTrace();
}
return result;
}
/**
* Use javax.xml.bind.DatatypeConverter class in JDK
* to convert byte array to a hexadecimal string. Note that this generates hexadecimal in upper case.
* @param hash
* @return
*/
private static String bytesToHex(byte[] hash) {
return DatatypeConverter.printHexBinary(hash);
}
To use DatatypeConverter, download the jar file from the below link.
http://www.java2s.com/Code/Jar/j/Downloadjavaxxmlbindjar.htm
Upvotes: -1
Reputation: 56925
Look at this example.
/**
* Encryption of a given text using the provided secretKey
*
* @param text
* @param secretKey
* @return the encoded string
* @throws SignatureException
*/
public static String hashMac(String text, String secretKey)
throws SignatureException {
try {
Key sk = new SecretKeySpec(secretKey.getBytes(), HASH_ALGORITHM);
Mac mac = Mac.getInstance(sk.getAlgorithm());
mac.init(sk);
final byte[] hmac = mac.doFinal(text.getBytes());
return toHexString(hmac);
} catch (NoSuchAlgorithmException e1) {
// throw an exception or pick a different encryption method
throw new SignatureException(
"error building signature, no such algorithm in device "
+ HASH_ALGORITHM);
} catch (InvalidKeyException e) {
throw new SignatureException(
"error building signature, invalid key " + HASH_ALGORITHM);
}
}
Where HASH_ALGORITHM is defined as:
private static final String HASH_ALGORITHM = "HmacSHA256";
public static String toHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder(bytes.length * 2);
Formatter formatter = new Formatter(sb);
for (byte b : bytes) {
formatter.format("%02x", b);
}
return sb.toString();
}
Upvotes: 22