我正在使用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(“:”),如果加密密钥本身有“:”作为字符,它不会导致问题吗?
加密时有没有办法避免“:”?或者有更好的存储密钥的方法吗?我不能使用散列,因为我需要其他功能的密钥。感谢。
答案 0 :(得分:2)
现在,如何从文件中读取密钥以进行解密?如果我使用line.split(“:”),如果加密密钥本身有“:”作为字符,它不会导致问题吗?
当然,这就是为什么split
确实有第二个可选参数max_split
:
key, value = line.split(':', 1)
或者,您可以使用partition
:
key, _, value = line.partition(':')
两者之间的区别是当根本没有结肠时会发生什么;前者将返回一个元素,从而尝试将其解压缩为两个变量给你ValueError
,而后者只会给你一个空value
。
但是,值得注意的是,如果你使用Base 64,:
永远不会出现在第一位。 Base 64使用的唯一字符是A
- Z
,a
- z
,0
- 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;在它,这应该工作正常。