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



我使用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-Za-z0-9+/。有一些Base64变体,其中可能有一个确实使用了:,但Python的base64模块应用的标准版本没有。

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

 username
 p4ssw0rd

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

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

您可以限制执行的拆分次数:

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

只要您知道字段名中没有":",这应该可以正常工作。

相关内容

  • 没有找到相关文章

最新更新