Primitive cross-language contro gli attacchi di timing comparativo delle stringhe?

3

Correlato, non un duplicato: Confronto tra stringhe sicure e tempistiche - Evitare la lunghezza Leak

  • So di mancanze della cache, supponiamo di inserirci in una linea di cache.
  • La risposta eccellente di Thomas non parla di jitter tranne quella introdotta da GC, né tocca l'esecuzione asincrona.
  • Possiamo assumere un'implementazione di basso livello (assemblatore, C, F77, Forth) che può essere utilizzata in qualsiasi linguaggio di livello superiore (ad es. Python)

Per favore correggimi se sbaglio:

  1. Stiamo parlando del confronto di due stringhe di lunghezza non uguale . Il primo è scelto da Eva, il secondo appartiene ad Alice. Alice vuole impedire a Eve di imparare la lunghezza e / o il contenuto della seconda stringa.
  2. Nessun linguaggio di programmazione mainstream esistente ha routine di confronto tra stringhe a tempo costante nella sua libreria standard.

  3. Per evitare perdite di informazioni sulla lunghezza, dobbiamo

    • hash precomputo di Victoria's segreto di Alice (la stessa funzione di hash non deve essere vulnerabile agli attacchi temporali)
    • calcolo dell'hash della stringa malvagia di Eva
    • confronta gli hash (stringhe di uguale lunghezza per definizione della funzione di hash) in tempo costante

    o

    • confronta semplicemente la stringa di Eve byte per byte con il segreto di Alice, incrementando un contatore (o due contatori, uno per corrispondenza e non corrispondente a byte?) fino alla fine della stringa di Eve?
  4. L'introduzione del jitter crittograficamente casuale è una misura valida per la difesa in profondità? (Si supponga che ciò avvenga su una LAN in un momento di calma quando il rumore di temporizzazione naturale è al minimo).

  5. L'esecuzione asincrona dei confronti (con alcune dure garanzie in tempo reale) è una difesa praticabile? (Sì, so che un altro canale laterale potrebbe perdere)

Cosa non sto sollecitando :

  • raccomandazioni per lingua / prodotto
  • risponde ' dipende dal tuo modello di minaccia ' (la mia minaccia si nasconde in un altro server dall'altra parte della stanza, con un numero illimitato di tentativi)
posta Deer Hunter 06.02.2016 - 02:20
fonte

2 risposte

1

wiki della comunità per ulteriori informazioni sull'argomento:

risposta data 14.02.2016 - 22:45
fonte
0

Puoi implementare la tua abbastanza facilmente. Di seguito è riportato Python, ma può essere adattato a qualsiasi lingua. Questo presuppone che il carattere '\ 0' non possa essere all'interno della stringa. Il problema diventa più interessante se il carattere '\ 0' è permesso. Potrei anche obiettare che len non è precalcolato in altre lingue, ma per il nostro bene penso che sia buono come quello che otterrà.

def timing_resistent_compare(str1, str2):
    # Get the length of each string.
    len1 = len(str1)
    len2 = len(str2)

    # Find the maximum of the two lengths, add 1 to force padding.
    max_len = max(len1, len2) + 1

    # Pad each string, at least one character is padded on due to above.            
    str1 = str1 + ('
def timing_resistent_compare(str1, str2):
    # Get the length of each string.
    len1 = len(str1)
    len2 = len(str2)

    # Find the maximum of the two lengths, add 1 to force padding.
    max_len = max(len1, len2) + 1

    # Pad each string, at least one character is padded on due to above.            
    str1 = str1 + ('%pre%' * (max_len - len1))
    str2 = str2 + ('%pre%' * (max_len - len2))

    # Do an OR sum of all the XORs of each character.
    differences = 0
    for ch1, ch2 in zip(str1, str2):
        differences |= ord(ch1) ^ ord(ch2)

    # If there are no differences, then the two strings are equal.
    return differences == 0
' * (max_len - len1)) str2 = str2 + ('%pre%' * (max_len - len2)) # Do an OR sum of all the XORs of each character. differences = 0 for ch1, ch2 in zip(str1, str2): differences |= ord(ch1) ^ ord(ch2) # If there are no differences, then the two strings are equal. return differences == 0
    
risposta data 12.09.2016 - 17:51
fonte

Leggi altre domande sui tag