将加密文件存储在数据库中

3 投票
4 回答
618 浏览
提问于 2025-04-16 17:10

我正在使用PyCrypto把一些文件存储在一个SQLite数据库里。

我用到了4个字段:
文件名,
文件的大小(以字节为单位),
文件的SHA512哈希值,
加密后的文件(使用AES加密,然后用base64转成ASCII)。

我需要这些字段能显示文件的一些信息,而不需要解密文件。

我的问题是:这样存储数据安全吗?
比如,一个ZIP文件或者可执行文件的前几个字符总是一样的,如果你已经知道了文件的哈希值和大小……那是否有可能部分解密这个文件呢?

如果这样不安全,我该如何存储一些关于文件的信息,以便在不解密的情况下对文件进行索引?(比如文件大小、哈希值、名称、标签等信息)

(我使用Python,但你可以用任何语言举例)

4 个回答

1

你不能光说“哦,AES-256当然安全。”从你的帖子来看,我能看出你对流密码和块密码的攻击方式搞混了,所以你可能不应该在真正研究这个话题之前就去实现它。

话虽如此,你必须了解一下块密码的工作模式。还有整个CWE-310系列。看看一些实用的密码学书籍也没坏处。毕竟,即使你了解了这些,还是有很多地方可能会搞砸。

真正的解决办法是:使用别人的实现

3

用AES加密的数据和原始数据的长度是差不多的(可能会有一点额外的填充),所以知道原始数据的长度并不会影响安全性。SHA512是一种强大的加密哈希算法,设计的目的是尽量少地透露关于原始内容的信息,所以我觉得这里也没有什么问题。

因此,我认为你的方案是相当安全的。通过这种方式“暴露”的信息几乎可以忽略不计。其实,管理密钥可能会是一个更大的问题。

1

为了避免前几个字节相同带来的问题,你应该使用AES加密算法的分组密码模式,并且要用一个随机的初始化向量(IV)。这样,即使两个加密文件的第一个块(长度取决于密钥大小)完全相同,生成的密文也会不同。

如果你这样做的话,我觉得你的方法没有问题。

撰写回答