web-dev-qa-db-fra.com

Quelle est la méthode la plus simple et la plus sûre pour générer une clé API et SECRET en Python

J'ai besoin de générer une clé API et un secret qui seraient stockés sur un serveur Redis. Quelle serait la meilleure façon de générer une clé et un secret?

Je développe une application basée sur le framework Django-tastypie.

20
Dhanushka Amarakoon

EDIT: pour un moyen très sécurisé de générer un nombre aléatoire, vous devez utiliser urandom:

from binascii import hexlify

key = hexlify(os.urandom(length))

cela produira des octets, appelez key.decode() si vous avez besoin d'une chaîne

Vous pouvez simplement générer des clés de la longueur souhaitée de la manière python:

import random
import string

def generate_key(length):
    return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(length))

Et puis vous pouvez simplement l'appeler avec la longueur souhaitée key = generate_key(40).
Vous pouvez spécifier l'alphabet que vous souhaitez utiliser, par exemple en utilisant uniquement string.ascii_lowercase Pour une clé composée uniquement de lettres minuscules, etc.

Il existe également un modèle pour l'authentification Api dans tastypie, peut-être intéressant de le vérifier https://Django-tastypie.readthedocs.org/en/latest/authentication.html#apikeyauthentication

16
T. Opletal

Si vous êtes sur Python 3.6 ou version ultérieure, le module secrets est le chemin à parcourir:

Le module secrets est utilisé pour générer des nombres aléatoires cryptographiquement solides adaptés à la gestion de données telles que les mots de passe, l'authentification de compte, les jetons de sécurité et les secrets associés.

En particulier, les secrets doivent être utilisés de préférence au générateur de nombres pseudo-aléatoires par défaut dans le module aléatoire, qui est conçu pour la modélisation et la simulation, pas pour la sécurité ou la cryptographie.

par exemple. pour générer un jeton de 16 octets:

>>> import secrets
>>> secrets.token_urlsafe(16)
'zs9XYCbTPKvux46UJckflw'
>>> secrets.token_hex(16)
'6bef18936ac12a9096e9fe7a8fe1f777'
25
Moby Duck

vous pouvez également utiliser le module suivant pour générer une chaîne aléatoire

 1 - os.urandom(64).encode('hex') #from os module
 2 - uuid.uuid4()                 # from uuid module
 3 - get_random_string(length=32) #from Django.utils.crypto
 4 - secrets.token_hex(64)         #from secrets >= python 3.6 
2

Ajout d'une réponse car je ne peux pas commenter la réponse de T. Opletals.

Vous ne devez pas utiliser random.choice car random n'est pas sécurisé cryptographiquement. Une meilleure option serait random.SystemRandom () qui utilise la source aléatoire du système, sur linux, ce serait urandom.

def generate_key(length):
    char_set = string.ascii_letters + string.punctuation                    
    urand = random.SystemRandom()                                           
    return ''.join([urand.choice(char_set) for _ in range(length)])
0
erik-j-d