2013-08-11 5 views
4

J'utilise Python 2.7 et je crée un HMAC en utilisant la bibliothèque hmac. Python 3.3 inclut une fonction compare_digest() qui va comparer deux digests et résister aux attaques de timing, mais ce n'est pas disponible en 2.7. Le conseil dominant n'est pas de rouler mon propre crypto, donc y at-il des bibliothèques Python matures qui fournissent cette fonctionnalité? PyCrypto ne semble pas.Comment vérifier en toute sécurité un HMAC dans Python 2.7?

Répondre

3

Pour toute personne qui trouve cette de la recherche, si vous utilisez Django, vous pouvez également utiliser la fonction constant_time_compare dans django.utils.crypto.

>>> from django.utils.crypto import constant_time_compare 
>>> constant_time_compare("foo", "bar") 
False 
>>> constant_time_compare("foo", "foo") 
True 

que cela vient avec la même mise en garde que hmac.compare_digest (et utilise effectivement hmac.compare_digest si elle existe):

Note: Si a et b sont de longueurs différentes, ou si une erreur se produit , une attaque de synchronisation pourrait théoriquement révéler des informations sur les types et les longueurs de a et b - mais pas leurs valeurs.

3

Je vous suggère de simplement utiliser la méthode de comparaison sécurisée disponible en 3.3.

Ceci est une mise en œuvre qui est très similaire à la mise en œuvre de Python:

def compare_digest(x, y): 
    if not (isinstance(x, bytes) and isinstance(y, bytes)): 
     raise TypeError("both inputs should be instances of bytes") 
    if len(x) != len(y): 
     return False 
    result = 0 
    for a, b in zip(x, y): 
     result |= a^b 
    return result == 0 

peut voir pas comment cela serait contraire à toutes les licences.

+0

Quelque chose manque à ma réponse, André? –

+0

Obtention de cette erreur lors de l'utilisation de ceci dans 2.7: 'type (s) d'opérande non supporté (s) pour ^: 'str' et 'str' – Trevor

Questions connexes