2014-10-10 161 views
0

我使用AES(来自PyCrypto)来加密密码并将其存储在文件中。该文件的格式是:从Python中的文件存储和读取加密的字符串

user:username 
key:<encrypted key> 

这是我用于加密的方法:

BLOCK_SIZE = .. 
PADDING = .. 
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING 

EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s))) 
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING) 
cipher = AES.new("abcdefgh12345678") 

encrypted_key = EncodeAES(cipher, 'ABC123') 

现在,我该如何从文件中读取用于解密它的关键?如果我使用line.split(“:”),如果加密的密钥本身具有“:”作为一个字符,它会不会造成问题?

有没有什么办法可以在加密时避免“:”?或者有更好的方法来存储密钥?我不能使用哈希,因为我需要一些其他功能的关键。谢谢。

回答

2

现在,我该如何从文件中读取密钥进行解密?如果我使用line.split(“:”),如果加密的密钥本身具有“:”作为一个字符,它会不会造成问题?

当然最好,这就是为什么恰好split有第二个可选的参数max_split

key, value = line.split(':', 1) 

或者,你可以使用partition

key, _, value = line.partition(':') 

两者之间的区别是当没有冒号时会发生什么;前者会返回一个元素,给你一个ValueError试图将其解压缩为两个变量,而后者只会给你一个空的value


然而,值得注意的是,如果你使用的基地64,:永远不会出现在第一的位置。 Base 64使用的唯一字符是A-Z,a-z, 0-9,+/。有一些Base 64变体,也许其中一个使用:,但Python的base64模块应用的标准版本没有。

+0

哦,没错。对不起,我没有意识到这一点。睡眠不足。谢谢。 – drunkenfist 2014-10-10 19:27:28

0

存储的用户名在第二行的第一行和密码,如以下

username 
p4ssw0rd 

这样你就不需要做这样的事情。

尽管最好的解决方案是将这些东西存储在数据库中。

+0

谢谢,但我需要它在键:值格式。我为每个用户提供了多个属性,并且它们可以按任意顺序排列。 – drunkenfist 2014-10-10 19:23:22

+0

然后我认真地建议使用真正的格式。 Python的使用很简单,例如JSON。比手动解析东西少得多的代码。 – dom0 2014-10-10 19:28:23

0

可以限制多少分割执行:

>>> line="key:foo:bar:baz" 
>>> line.split(":", 1) 
['key', 'foo:bar:baz'] 

只要你知道字段名没有“:”看来,这应该能正常运行。

相关问题