Qual è il formato di messaggio HMAC ideale se il messaggio è un array?

2

Sto utilizzando HMAC esattamente come previsto per verificare l'integrità di un messaggio. Tuttavia, il messaggio è in realtà un array associativo (o un hash).

Dato che questo sarà fatto su varie piattaforme (dentro e fuori il nostro controllo), abbiamo bisogno di un modo standard per convertire l'array in una stringa.

Ho visto i tubi usati come separatori in molti posti. Questa vulnerabilità in AWS è il tipo di cosa che voglio evitare.

Dì, il mio messaggio è {a:1,b:2} , la conversione in a1b2 va bene?

O dovrei andare per qualcosa come 1|2 (Poi l'ordine della chiave diventa importante).

Un'altra soluzione sarebbe stata la conversione JSON, ma JSON non garantisce l'ordine delle chiavi, quindi potrebbe dare risultati diversi in diverse librerie.

Varie idee di cui stiamo discutendo:

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"

Sono propenso alla prima o alla terza scelta, ma ci sono modi in cui posso giudicare il mio approccio?

    
posta Nemo 04.02.2015 - 09:34
fonte

1 risposta

1

Potresti codificare in questo modo:

x1 key1 Y1 data1 x2 key2 y2 data2

Dove x1 è la lunghezza della chiave e y1 è la lunghezza dei dati.

In questo modo assicuri che le chiavi siano nello stesso ordine e puoi inserire qualsiasi dato binario. Definisci un limite per la lunghezza della chiave e dei dati e utilizza il riempimento per assicurarti che x e y utilizzino la stessa lunghezza:

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

Non devi preoccuparti di separatori, json o altro. E puoi decodificare la stringa con uno snippet PHP come questo:

$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;
}

L'esecuzione mostrerà questo:

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 
    
risposta data 04.02.2015 - 21:23
fonte

Leggi altre domande sui tag