2010-11-04 43 views
2

我需要加密存储在web2py中的数据,更确切地说是密码。在web2py中加密存储数据的最佳方式是什么?

这不是关于认证,而是类似于KeePass的应用程序中的更多内容。

我已经看到这是包含在web2py,但M2Secret可以很容易地做到这一点。随着M2Secret我可以用这个:

 
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') 

但我必须包括在我的设备中的M2Crypto库。

有没有办法做到这一点PyMe已经包含在web2py中?

回答

3

默认情况下,web2py使用HMAC + SHA512存储密码散列,所以没有什么可以做的。它比你建议的机制要好,因为加密是可逆的,而散列不是。你可以改变这一点,并按照你的要求进行操作,但不会比使用纯文本更安全(因为你必须在应用程序中公开加密密钥)。

无论如何。假设您有一个

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

并且您想使用m2secret。你会这样做:

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") 

在web2py验证器也是双向过滤器。

+0

感谢Massimo,这会让我走向正确的方向。 – Cyann 2010-11-04 13:07:47

+0

请注意,我需要使用可逆加密存储数据,因为应用程序的目标是分发存储的密码。我担心的是对数据库的离线攻击,这就是为什么我要加密数据。但我会看看PyMe中提供的公钥算法,以避免在web2py中添加依赖关系。 – Cyann 2010-11-04 13:17:20

+0

您可能需要考虑将数据库存储在加密文件系统中(可能位于文件中)。如果最好将加密责任交给操作系统而不是应用程序,因为如果第一个可能会在攻击情况下受到损害,那么后者应该是加密责任。 – mdipierro 2010-11-04 13:24:16

相关问题