2010-11-04 37 views
2

J'ai besoin de crypter les données stockées dans web2py, plus précisément les mots de passe.Quel est le meilleur moyen de crypter les données stockées dans web2py?

Il ne s'agit pas d'une authentification, mais de quelque chose de plus dans la ligne d'une application similaire à KeePass. J'ai vu que cela est inclus dans web2py, mais M2Secret pourrait facilement le faire. Avec M2Secret je peux utiliser ceci:

 
import m2secret 

# Encrypt 
secret = m2secret.Secret() 
secret.encrypt('my data', 'my master password') 
serialized = secret.serialize() 

# Decrypt 
secret = m2secret.Secret() 
secret.deserialize(serialized) 
data = secret.decrypt('my master password') 

Mais je dois inclure la bibliothèque M2Crypto dans mon appareil.

Y a-t-il un moyen de faire cela avec PyMe qui est déjà inclus avec web2py?

Répondre

3

Par défaut, web2py stocke les mots de passe hachés à l'aide de HMAC + SHA512, il n'y a donc rien à faire pour vous. C'est mieux que le mécanisme que vous suggérez parce que le cryptage est réversible alors que le hachage ne l'est pas. Vous pouvez changer cela et faire ce que vous demandez ci-dessus mais ce ne serait pas plus sûr que d'utiliser le texte en clair (puisque vous auriez à exposer la clé de chiffrement dans l'application).

Quoi qu'il en soit. Supposons que vous ayez un

db.define_table('mytable',Field('myfield'.'password')) 

et que vous souhaitiez utiliser m2secret. Vous devriez faire:

class MyValidator: 
    def __init__(self,key): self.key=key 
    def __call__(self,value): 
     secret = m2secret.Secret() 
     secret.encrypt(value, self.key) 
     return secret.serialize() 
    def formatter(self,value): 
     secret = m2secret.Secret() 
     secret.deserialize(value) 
     return (secret.decrypt(self.key),None) 

db.mytable.myfield.requires=MyValidator("master password") 

Dans les valideurs web2py sont également des filtres bidirectionnels.

+0

Merci Massimo, cela me mènera dans la bonne direction. – Cyann

+0

Notez que j'ai besoin de stocker les données en utilisant le cryptage réversible que l'objectif de l'application est de distribuer les mots de passe stockés. Mon souci est avec l'attaque hors ligne sur la base de données, c'est pourquoi je veux crypter les données. Mais je vais jeter un oeil aux algorithmes de clé publique disponibles dans PyMe pour éviter d'ajouter des dépendances dans web2py. – Cyann

+0

Vous pouvez envisager de stocker la base de données dans un système de fichiers crypté (peut-être dans un fichier). Si mieux vaut remettre la responsabilité de chiffrement au système d'exploitation qu'à l'application puisque celle-ci est la première qui pourrait être compromise en cas d'attaque. – mdipierro