我想知道是否有办法通过消息获取密钥,并通过将密钥应用解密算法(SHA1)与密钥一起生成MAC,但密钥确实如此不知道,我该怎么办?我有一个随机计算MAC的例子,如下所示:
public class MACApp {
public static void main(String[] args) {
//if(args.length < 1) System.out.println("Úsese MACApp \"hola\"");
//else performMACTest(args[0]);
performMACTest("Hola");
}
public static void performMACTest(String s) {
try {
// Elegimos el algoritmo de hashing
String alg = "HmacMD5";
// Creamos un objeto Mac que implementa el algoritmo especificado
Mac mac = Mac.getInstance(alg);
// Construimos un genrador de claves privadas
KeyGenerator generador = KeyGenerator.getInstance(alg);
// Creamos una clave privada con el generador de claves
SecretKey clavePrivada = generador.generateKey();
mac.init(clavePrivada);
// Pasamos la cadena de caracteres a un array de bytes y lo procesamos
// con el algoritmo del Mac, es decir, procesamos (de manera indirecta) el
// string que hemos pasado como parámetro
mac.update(s.getBytes());
// Indicamos que ya hemos acabado y recogemos el resultado
byte[] b = mac.doFinal();
System.out.println("\nMensaje original: " + s);
System.out.println("\nMAC :" + Conversor.aCadenaDeHexadecimales(b));
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
class Conversor {
public static String[] digitos =
{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"};
public static String aCadenaDeHexadecimales(byte[] array) {
String cadena = "";
for (int i = 0; i < array.length; i++)
cadena = cadena + convertirUno(array[i]);
return cadena;
}
private static String convertirUno(byte valor) {
int n = valor;
if (n < 0) n = 256 + n;
int d1 = n / 16;
int d2 = n % 16;
return digitos[d1] + digitos[d2];
}
}
如果有人我可以帮忙找到钥匙。我举了一个例子:
消息:231456789 487654 500
MAC:5807a9647ed99e98b8d197e608c1de8bcffa571f
要加密/解密的哈希类型是SHA1,密钥的大小也是24位,即必须有3个字符。
答案 0 :(得分:1)
获得关键就像为攻击者找到圣杯;如果你得到密钥,那么由该密钥加密或保护的所有内容基本上都会被破坏。因此,虽然密码和其他原语(如用于哈希函数的原语)存在许多问题,但通常无法获取密钥。
HMAC建立在安全的,单向哈希函数之上。由于函数是一种方法,因此不应该在没有强制执行的情况下检索键值。即使对于HMAC-MD5和HMAC-SHA1也是如此 - 即MAC功能建立在很大程度上破坏的哈希函数上。
你可以尝试直到世界末日,但你将无法找回钥匙 - 也不能解决这个问题的圣杯。