介绍
我目前正在从事一个项目,该项目涉及每天从 VisualFox Pro 数据库中提取数据(药房记录),并将其中的一些上传到 WordPress 网站,药房的客户可以安全地查看它。我想就我的软件的一般方法获得一些建议——我可以编写代码,但需要知道我是否走对了路。我正在编写 PC 软件(在 C#/.NET 4.5 中)和 PHP WordPress 插件。
问题一:加密
我打算使用的当前加密数据服务器端的过程是基于这篇文章。总而言之,它提倡使用存储在服务器上的自己的公钥对每个单独用户的数据进行非对称加密。然后,用于解密此数据的私钥本身使用用户的密码进行对称加密并存储。这样,即使数据库被盗,也需要破解用户的密码哈希,甚至需要对每个用户的数据重复该过程。
作者自己指出的唯一弱点,也是我问题的重点,是当用户登录时,解密的密钥存储在会话存储中。文章建议的处理方式是限制用户登录的时间。我认为更好的解决方案是将该密钥存储在一个短暂的安全 cookie 中(当然整个过程是通过 HTTPS 进行的) . 这样,如果攻击者控制了用户的计算机并且可以读取他们的cookie,他们可能只需要输入密码并登录,而无需窃取数据库,而即使攻击者获得了对服务器的访问权限,他们也无法解密HTTPS 流量(或者可以吗?我不确定。)
我应该使用安全 cookie 还是会话存储来临时存储解密的密钥?
问题 2:存储
我还想解决的第二件事是如何存储数据——这更像是一个效率问题。由于每个用户都有自己的加密密钥,因此每个用户的记录必须单独存储。我不知道我是否应该为每个用户存储一个“块”数据,其中包含带有表示记录的对象数组的加密 JSON,或者我是否应该将记录存储在具有实际数据结构的表中,并加密每个数据字段与钥匙分开。
我倾向于将数据存储为一个块 - 在我看来,一次解密一大块数据似乎比数千个单独的字段更有效。此外,即使我以正确的结构存储数据,我仍然无法使用 MySQL 的 WHERE、ORDERBY 等,因为数据都是 BLOB。
我应该将数据存储为每个用户的大块,还是分成不同的字段?
问题3:转移
我从 DBF 文件中提取数据,本质上是做一个“差异”,我比较从前一天的数据中提取的当前数据,只上传已经改变的用户块(我不能只上传记录,因为我可能最终会将用户的数据存储在块中)。我还包括已删除用户的“删除”说明。这是因为数据库中有数十万条记录,总计超过 200mb,并且大小每天都在增加。
我目前的计划是将所有这些数据写入一个 JSON 文件,gzip 并将其上传到服务器。我的问题是,如何在确保数据安全的同时做到这一点?自然,上传将通过 HTTPS 进行,并且我有一个 API 密码,仅允许授权上传,但我主要关心的是如果服务器受到破坏,如何保护数据。我不希望攻击者在处理 JSON 文件时从服务器中获取它。我的一个想法是让服务器向我发送用户的公钥列表,并在上传之前在我的软件中执行加密。在我看来,这是保护这些数据的唯一方法。我可以加密整个 JSON 文件,可能使用 API 密钥或特殊密码,但如果攻击者可以直接访问解密文件,那就没有意义了 s 在服务器上处理。这是一个好的解决方案吗?
我应该在客户端单独加密数据,还是有办法将其安全地传输到服务器并在那里加密?
提前感谢您的任何答案,我很想听听以前处理过此类问题的人的意见。
注意:交叉发布给程序员,请参阅评论。