web-dev-qa-db-fra.com

Hachage aléatoire dans Python

Quelle est la façon la plus simple de générer un hachage aléatoire (MD5) en Python?

84
mistero

Un hachage md5 est juste une valeur de 128 bits, donc si vous voulez un aléatoire:

import random

hash = random.getrandbits(128)

print("hash value: %032x" % hash)

Je ne vois pas vraiment le point, cependant. Vous devriez peut-être expliquer pourquoi vous en avez besoin ...

120
sth

Je pense que ce que vous recherchez est un identifiant unique universel. Ensuite, le module UUID dans python est ce que vous recherchez.

import uuid
uuid.uuid4().hex

UUID4 vous donne un identifiant unique aléatoire qui a la même longueur qu'une somme md5. Hex représentera une chaîne hexadécimale au lieu de renvoyer un objet uuid.

http://docs.python.org/2/library/uuid.html

77
sebs

Cela fonctionne pour les deux python 2.x et 3.x

import os
import binascii
print(binascii.hexlify(os.urandom(16)))
'4a4d443679ed46f7514ad6dbe3733c3d'
43
Buttons840

Le module secrets a été ajouté dans Python 3.6+. Il fournit des valeurs aléatoires cryptographiquement sécurisées avec un seul appel. Les fonctions prennent une option nbytes argument, la valeur par défaut est 32 (octets * 8 bits = jetons 256 bits). MD5 a des hachages 128 bits, donc fournissez 16 pour les jetons "de type MD5".

>>> import secrets

>>> secrets.token_hex(nbytes=16)
'17adbcf543e851aa9216acc9d7206b96'

>>> secrets.token_urlsafe(16)
'X7NYIolv893DXLunTzeTIQ'

>>> secrets.token_bytes(128 // 8)
b'\x0b\xdcA\xc0.\x0e\x87\x9b`\x93\\Ev\x1a|u'
27
Nick T

Encore une autre approche. Vous n'aurez pas à formater un int pour l'obtenir.

import random
import string

def random_string(length):
    pool = string.letters + string.digits
    return ''.join(random.choice(pool) for i in xrange(length))

Vous donne une flexibilité sur la longueur de la chaîne.

>>> random_string(64)
'XTgDkdxHK7seEbNDDUim9gUBFiheRLRgg7HyP18j6BZU5Sa7AXiCHP1NEIxuL2s0'
16
Matthew Taylor

Une autre approche de cette question spécifique:

import random, string

def random_md5like_hash():
    available_chars= string.hexdigits[:16]
    return ''.join(
        random.choice(available_chars)
        for dummy in xrange(32))

Je ne dis pas que c'est plus rapide ou préférable à toute autre réponse; juste que c'est ne autre approche :)

6
tzot
import uuid
from md5 import md5

print md5(str(uuid.uuid4())).hexdigest()
5
Sam
import os, hashlib
hashlib.md5(os.urandom(32)).hexdigest()
2
gizzmole
from hashlib import md5
plaintext = input('Enter the plaintext data to be hashed: ') # Must be a string, doesn't need to have utf-8 encoding
ciphertext = md5(plaintext.encode('utf-8').hexdigest())
print(ciphertext)

Il convient également de noter que MD5 est une fonction de hachage très faible, des collisions ont également été trouvées (deux valeurs de texte en clair différentes donnent le même hachage) Utilisez simplement une valeur aléatoire pour plaintext.

0
Eric Jin