¿Primitivos entre lenguajes contra ataques de tiempo de comparación de cadenas?

3

Relacionado, no un duplicado: Sincronización de cadenas seguras - Evitar la longitud Fuga

  • Sé que hay errores de caché, supongamos que encajamos en una línea de caché a toda velocidad.
  • La excelente respuesta de Thomas no habla de jitter, excepto la introducida por GC, ni toca la ejecución asíncrona.
  • Podemos asumir una implementación de bajo nivel (ensamblador, C, F77, Forth) que se puede usar en cualquier lenguaje de nivel superior (por ejemplo, Python)

Por favor, corrígeme si me equivoco:

  1. Estamos hablando de comparar dos cadenas de desigual . El primero es elegido por Eva, el segundo pertenece a Alicia. Alice quiere evitar que Eve aprenda la longitud y / o el contenido de la segunda cadena.
  2. Ningún lenguaje de programación convencional existente tiene rutinas de comparación de cadenas de tiempo constante en su biblioteca estándar.

  3. Para evitar la pérdida de información de longitud, ¿lo hacemos?

    • hash precomputa de Victoria's el secreto de Alicia (la función hash en sí misma no debe ser vulnerable a los ataques de tiempo)
    • calcular el hash de la cadena maligna de Eve
    • comparar hashes (cadenas de igual longitud por definición de la función hash) en tiempo constante

    o

    • simplemente compare el byte por byte de la cadena de Eve con el secreto de Alice, ¿incrementando un contador (o dos contadores, uno para el otro y para que no coincida con los bytes) hasta el final de la cadena de Eve?
  4. ¿La introducción de la fluctuación aleatoria criptográfica es una medida válida de defensa en profundidad? (Por favor, suponga que esto sucede en una LAN en un momento de silencio cuando el ruido de sincronización natural es mínimo).

  5. ¿La ejecución asíncrona de las comparaciones (con algunas garantías duras en tiempo real) es una defensa viable? (Sí, sé que otro canal lateral puede estar perdiendo)

Lo que no solicito :

  • recomendaciones de idioma / producto
  • responde ' depende de tu modelo de amenaza ' (mi amenaza se esconde en otro servidor en la habitación, con un número ilimitado de intentos)
pregunta Deer Hunter 06.02.2016 - 02:20
fuente

2 respuestas

1

Wiki de la comunidad para obtener más información sobre el tema:

respondido por el Deer Hunter 14.02.2016 - 22:45
fuente
0

Usted puede implementar su propio muy fácilmente. A continuación se muestra Python, pero se puede adaptar a cualquier idioma. Esto supone que el carácter '\ 0' no puede estar dentro de la cadena. El problema se vuelve más interesante si se permite el carácter '\ 0'. También podría argumentar que len no se calcula previamente en otros idiomas, pero por nuestro bien, creo que esto es lo mejor que se puede obtener.

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
    
respondido por el Seth M. Larson 12.09.2016 - 17:51
fuente

Lea otras preguntas en las etiquetas