在Python中存储和读取文件中的加密字符串

时间:2014-10-10 19:16:05

标签: python pycrypto

我正在使用AES(来自PyCrypto)加密密码并将其存储在文件中。该文件的格式为:

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(“:”),如果加密密钥本身有“:”作为字符,它不会导致问题吗?

加密时有没有办法避免“:”?或者有更好的存储密钥的方法吗?我不能使用散列,因为我需要其他功能的密钥。感谢。

3 个答案:

答案 0 :(得分:2)

  

现在,如何从文件中读取密钥以进行解密?如果我使用line.split(“:”),如果加密密钥本身有“:”作为字符,它不会导致问题吗?

当然,这就是为什么split确实有第二个可选参数max_split

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

或者,您可以使用partition

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

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


但是,值得注意的是,如果你使用Base 64,:永远不会出现在第一位。 Base 64使用的唯一字符是A - Za - z0 - 9+,和/。有一些Base 64变体,其中一个可能使用:,但是由Python的base64模块应用的标准版本没有。

答案 1 :(得分:0)

将用户名存储在第一行,将密码存储在第二行,如下所示

 username
 p4ssw0rd

这样你就不需要做这类事情了。

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

答案 2 :(得分:0)

您可以约束执行的分割数量:

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

只要您知道字段名称没有&#39;:&#39;在它,这应该工作正常。