Une tentative naïve échoue lamentablement:Comment dériver de hashlib.sha256 en Python?
import hashlib
class fred(hashlib.sha256):
pass
-> TypeError: Error when calling the metaclass bases
cannot create 'builtin_function_or_method' instances
Eh bien, il se trouve que hashlib.sha256 est appelable, pas une classe. Essayer quelque chose d'un peu plus créatif ne fonctionne pas non plus:
import hashlib
class fred(type(hashlib.sha256())):
pass
f = fred
-> TypeError: cannot create 'fred' instances
Hmmm ...
Alors, comment puis-je le faire?
Voici ce que je veux réellement atteindre:
class shad_256(sha256):
"""Double SHA - sha256(sha256(data).digest())
Less susceptible to length extension attacks than sha256 alone."""
def digest(self):
return sha256(sha256.digest(self)).digest()
def hexdigest(self):
return sha256(sha256.digest(self)).hexdigest()
Fondamentalement, je veux que tout passer, sauf quand quelqu'un appelle à un résultat que je veux insérer une étape supplémentaire de mon propre. Y at-il une manière intelligente que je peux accomplir ceci avec __new__
ou la magie de métaclasse de quelque sorte?
J'ai une solution Je suis largement satisfait de ce que j'ai posté comme réponse, mais je suis vraiment intéressé de voir si quelqu'un peut penser à quelque chose de mieux. Soit beaucoup moins verbeux avec un coût très faible en lisibilité ou beaucoup plus rapide (en particulier lorsque vous appelez update
) tout en restant quelque peu lisible.
Mise à jour: j'ai couru quelques tests:
# test_sha._timehash takes three parameters, the hash object generator to use,
# the number of updates and the size of the updates.
# Built in hashlib.sha256
$ python2.7 -m timeit -n 100 -s 'import test_sha, hashlib' 'test_sha._timehash(hashlib.sha256, 20000, 512)'
100 loops, best of 3: 104 msec per loop
# My wrapper based approach (see my answer)
$ python2.7 -m timeit -n 100 -s 'import test_sha, hashlib' 'test_sha._timehash(test_sha.wrapper_shad_256, 20000, 512)'
100 loops, best of 3: 108 msec per loop
# Glen Maynard's getattr based approach
$ python2.7 -m timeit -n 100 -s 'import test_sha, hashlib' 'test_sha._timehash(test_sha.getattr_shad_256, 20000, 512)'
100 loops, best of 3: 103 msec per loop
Qu'était -1 à propos de ma question? – Omnifarious
(p i n g) –
Eh bien, appliquer SHA256 deux fois ne renforcera pas du tout la sécurité. Si vous avez une collision sur sha256 seul, alors les digests sont identiques, donc le second sha256 va générer le même hachage. Si vous voulez de la sécurité, vous devez combiner des hachages, pas les enchaîner. – BatchyX