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