¿Cuál es el formato ideal de mensaje HMAC si el mensaje es una matriz?

2

Estoy usando HMAC exactamente como se pretende para verificar la integridad de un mensaje. Sin embargo, el mensaje es realmente una matriz asociativa (o un hash).

Dado que esto se realizará en varias plataformas (dentro y fuera de nuestro control), necesitamos una forma estándar de convertir la matriz en una cadena.

He visto tuberías que se utilizan como separadores en muchos lugares. Esta vulnerabilidad en AWS es el tipo de cosa que quiero evitar.

Diga, mi mensaje es {a:1,b:2} , ¿convertirlo a a1b2 estaría bien?

O debería ir por algo como 1|2 (entonces el orden de las teclas se vuelve importante).

Otra solución hubiera sido la conversión JSON, pero JSON no garantiza el orden de las claves, por lo que puede dar diferentes resultados en diferentes bibliotecas.

Varias ideas que estamos discutiendo:

data = {:c=>3,:a=>1,:b=>2}
data.sort.join
"a1b2c3"
data.values.sort.join
"123"
data.sort.join('|')
"a|1|b|2|c|3"

Me inclino por la primera o la tercera opción, pero ¿hay alguna forma de juzgar mi enfoque?

    
pregunta Nemo 04.02.2015 - 09:34
fuente

1 respuesta

1

Podrías codificar así:

x1 key1 y1 data1 x2 key2 y2 data2

Donde x1 es la longitud de la clave, y y1 es la longitud de los datos.

De esta manera, se asegura de que las claves estén en el mismo orden, y puede poner datos binarios en ellas. Simplemente defina un límite para la clave y la longitud de los datos, y use el relleno para asegurarse de que x y y usen la misma longitud:

004 key1 005 test1 002 k1 025 larga binaŕy śtring

No necesitas preocuparte por los separadores, json o cualquier cosa. Y puedes decodificar la cadena con un fragmento de código PHP como este:

$data = "004key1005test1002k1025long random binary string";
$len = 3; // up to 999 bytes of data
$start=0;

while ($start < strlen($data) - $len) {
        $stringSize=intval(substr($data, $start, $len));
        echo "String size: $stringSize\n";
        $stringData = substr($data, $start + $len, $stringSize);
        echo "String data: $stringData \n";
        $start += $len + $stringSize;
}

La ejecución mostrará esto:

String size: 4
String data: key1 
String size: 5
String data: test1 
String size: 2
String data: k1 
String size: 25
String data: long random binary string 
    
respondido por el ThoriumBR 04.02.2015 - 21:23
fuente

Lea otras preguntas en las etiquetas