我正在尝试创建一个应用程序,在将所有用户输入数据发送到服务器之前对其进行加密,然后将其存储在sql数据库中。我们的想法是数据库中的数据始终是加密的,并且只能在客户端应用程序上解密,所以我想在客户端应用程序上创建和存储私钥。 第二个要求是所有应用程序都可以解密写在服务器数据库上的数据,因此我假设所有应用程序应该共享相同的私钥。
我的问题是:
修改
只是为了澄清一点
让我们说我们有类似云服务的东西,每个云都可以加入很多设备。当其中一个设备更改某些资源时,所有设备都会与其云同步。该云用一个配置文件表示,该配置文件包含有关拥有设备的用户的一些个人数据。我希望加入云(C1)的所有设备都可以看到(读取)与该云相关联的个人数据,我不喜欢的是某些数据库管理员可以读取该数据。所以我想在客户端加密数据,并在客户端解密。
简而言之,加密不是出于传输目的,因为我使用ssl,它只是尝试遵循新的GDPR规范个人数据的安全性。
编辑1
经过一番调查后,我发现了一些名为"客户端加密"。它完全符合我的需求,数据在客户端加密,发送到服务器,存储在db中,并在客户端再次解密。但我似乎无法找到一种方法来处理在我的项目中硬编码私钥的需要。为了将它保存到钥匙串,我必须从某个地方加载它,如果我生成它比其他客户端不会有相同的密钥,它将无法解密数据。所以有人帮助我,我是从错误的角度看待这个吗?
答案 0 :(得分:5)
假设您使用TLS,我们可以概述您提出的以下要求:
存储在服务器上的所有信息都必须加密,以免服务器泄露泄露任何数据。
给定"云中的所有客户"可以访问该云中的所有数据。
客户端设备丢失不会泄露云中的任何信息。
然后我们可以概述一个类似的E2E方案:
首次创建用户时,生成公钥/私钥客户端并将公钥传输到服务器。使用从用户密码生成的对称密钥加密私钥客户端。因此,任何需要此私钥的操作也需要用户密码,以防止设备被盗。
当用户希望创建"云组"时,为该组生成对称密钥并使用用户公钥对其进行加密。将此密钥存储在客户端设备上,使用用户公钥加密。
当用户想要将另一个用户添加到他们的"云组"时,使用新用户公钥加密组对称密钥并进行传输。
"云组内的通信和存储"使用组对称密钥。
请注意,在此方案中:
服务器无法解密任何数据,因为组对称密钥只在用特定用户公钥加密时才触及服务器。
用户密码总是需要使用他们的私钥,因此盗窃设备不能向窃贼公开任何信息。
答案 1 :(得分:2)
您可以模仿iMessages的工作方式:https://www.apple.com/business/docs/iOS_Security_Guide.pdf
在高级别:在设备上生成公钥 - 私钥对,私钥存储在钥匙串中。公钥在服务器上注册并与用户/设备相关联。发送邮件时,服务会查找收件人的公钥并使用该邮件加密邮件,以便只有收件人才能对其进行解密。
Apple使用钥匙串,因此请按照您的意愿对其进行安全操作。
答案 2 :(得分:1)
即使私钥从客户端被盗,攻击者也只能在拥有密文的情况下解密密文。
服务器和客户端只有在彼此进行身份验证后才应发送彼此的密文。
然后,如果通过TLS连接发送数据,则额外的加密层会保护传输中的密文。