2010-07-03 32 views
0

J'ai un code:Problèmes avec Python hashlib.sha256 (2.4.3)

signature = hmac.new(
    key=AWS_SECRET_ACCESS_KEY, 
    msg=string_to_sign, 
    digestmod=hashlib.sha256).digest() 

Cela fonctionne parfaitement sur mon propre ordinateur (a python 2.6.1). Cependant, quand je lance ce code sur mon serveur (Python 2.4.3) Je reçois le texte suivant:

/home/MYUSERNAME/public_html/Foo.com/cgi-bin/foo.py 
    66  key=AWS_SECRET_ACCESS_KEY, 
    67  msg=string_to_sign, 
    68  digestmod=hashlib.sha1).digest() 
    69 
    70 # Base64 encode the signature 
digestmod = <built-in function openssl_sha256>, hashlib = <module 'hashlib' from '/usr/lib/python2.4/site-...shlib-20081119-py2.4-linux-i686.egg/hashlib.pyc'>, hashlib.sha1 = <built-in function openssl_sha1>,).digest undefined 
/usr/lib/python2.4/hmac.py in new(key='xR6MsC/+Vc2xkd0YYbER0meR/IkWEU', msg='GET\necs.amazonaws.com\n/onca/xml\nAWSAccessKeyId=A...CommerceService&Timestamp=2010-07-03T18%3A56%3A48', digestmod=<built-in function openssl_sha1>) 
    103  You can now feed arbitrary strings into the object using its update() 
    104  method, and can ask for the hash value at any time by calling its digest() 
    105  method. 
    106  """ 
    107  return HMAC(key, msg, digestmod) 
global HMAC = <class hmac.HMAC>, key = 'xR6MsC/+Vc2xkd0YYbER0meR/IkWEU', msg = 'GET\necs.amazonaws.com\n/onca/xml\nAWSAccessKeyId=A...CommerceService&Timestamp=2010-07-03T18%3A56%3A48', digestmod = <built-in function openssl_sha1> 
/usr/lib/python2.4/hmac.py in __init__(self=<hmac.HMAC instance>, key='xR6MsC/+Vc2xkd0YYbER0meR/IkWEU', msg='GET\necs.amazonaws.com\n/onca/xml\nAWSAccessKeyId=A...CommerceService&Timestamp=2010-07-03T18%3A56%3A48', digestmod=<built-in function openssl_sha1>) 
    40 
    41   self.digestmod = digestmod 
    42   self.outer = digestmod.new() 
    43   self.inner = digestmod.new() 
    44   self.digest_size = digestmod.digest_size 
self = <hmac.HMAC instance>, self.outer undefined, digestmod = <built-in function openssl_sha1>, digestmod.new undefined 

AttributeError: 'builtin_function_or_method' object has no attribute 'new' 
     args = ("'builtin_function_or_method' object has no attribute 'new'",) 

Je sais que la réponse évidente est de mettre à jour juste Python sur mon serveur, mais mon hôte doit faire et Je ne sais pas combien de temps ça va prendre. Je suis juste curieux de savoir s'il s'agit d'un problème commun/connu sur 2.4.3 ou si quelque chose d'autre se passe.

Merci

Répondre

0

hashlib est nouveau à 2,5. Vous aurez besoin du backport pour les anciennes versions de Python.

+0

Ignacio, merci! Cela explique tout :) –

+0

En fait, cela n'explique pas tout. Le backport mentionné n'est pas compatible avec le module hmac de la même façon que python 2.5+ est ... Il manque la méthode sha256.new qui signifie qu'il ne peut pas être transmis à hmac sous forme de digestmod .... –

0

C'est un hack pour rendre le travail de hashlib backport avec HMAC sur Python 2.4:

class mysha256: 
    digest_size = 32 
    def new(self, inp=''): 
     return hashlib.sha256(inp) 

et utiliser HMAC comme ceci:

signature = hmac.new(
    key=AWS_SECRET_ACCESS_KEY, 
    msg=string_to_sign, 
    digestmod=mysha256()).digest()