我使用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')
现在,我如何从文件中读取密钥以对其进行解密?如果我使用行.split(":"),如果加密密钥本身有":"作为字符,这不会引起问题吗?
加密时有没有办法避免":"?或者有更好的方法来存放钥匙吗?我不能使用哈希,因为我需要一些其他功能的密钥。谢谢
现在,我如何从文件中读取密钥以对其进行解密?如果我使用行.split(":"),如果加密密钥本身有":"作为字符,这不会引起问题吗?
当然会——这就是为什么split
有第二个可选参数max_split
:
key, value = line.split(':', 1)
或者,您可以使用partition
:
key, _, value = line.partition(':')
两者的区别在于,当根本没有冒号时会发生什么;前者将返回一个元素,通过尝试将其解包为两个变量得到一个ValueError
,而后者只会给你一个空的value
。
然而,值得注意的是,如果您使用的是Base64,:
将永远不会出现在第一位。Base 64使用的唯一字符是A
-Z
、a
-z
、0
-9
、+
和/
。有一些Base64变体,其中可能有一个确实使用了:
,但Python的base64
模块应用的标准版本没有。
将用户名存储在第一行,密码存储在第二行,如下
username
p4ssw0rd
这样你就不需要做这种事情了。
尽管最好的解决方案是将这些东西存储在数据库中。
您可以限制执行的拆分次数:
>>> line="key:foo:bar:baz"
>>> line.split(":", 1)
['key', 'foo:bar:baz']
只要您知道字段名中没有":",这应该可以正常工作。