在将客户端应用程序发送到服务器之前对其进行加密

时间:2017-11-29 15:37:29

标签: ios encryption cryptography

我正在尝试创建一个应用程序,在将所有用户输入数据发送到服务器之前对其进行加密,然后将其存储在sql数据库中。我们的想法是数据库中的数据始终是加密的,并且只能在客户端应用程序上解密,所以我想在客户端应用程序上创建和存储私钥。 第二个要求是所有应用程序都可以解密写在服务器数据库上的数据,因此我假设所有应用程序应该共享相同的私钥。

我的问题是:

  • 如何在项目中存储私钥以确保其安全: 我正在考虑对它进行模糊处理,然后将其存储到钥匙串中,但是 据我所知,混淆和钥匙串都不是很安全。我的 关注的是,如果我的所有应用实例都使用相同的私钥 黑客可以通过越狱来轻松访问我的数据 自己的电话。如果我在飞行中生成它比所有应用程序都有 不同的私钥,并且无法以可读的方式共享数据 形式
  • 实现这一目标的最佳实践是什么,如果是钥匙串 是不安全的,有没有其他地方或方式这样做,如果有的话 不是我会使用钥匙串,但至少我想解决问题 项目中的硬编码密钥,以便它可以保存在钥匙串中 第一次运行

修改

只是为了澄清一点

让我们说我们有类似云服务的东西,每个云都可以加入很多设备。当其中一个设备更改某些资源时,所有设备都会与其云同步。该云用一个配置文件表示,该配置文件包含有关拥有设备的用户的一些个人数据。我希望加入云(C1)的所有设备都可以看到(读取)与该云相关联的个人数据,我不喜欢的是某些数据库管理员可以读取该数据。所以我想在客户端加密数据,并在客户端解密。

简而言之,加密不是出于传输目的,因为我使用ssl,它只是尝试遵循新的GDPR规范个人数据的安全性。

编辑1

经过一番调查后,我发现了一些名为"客户端加密"。它完全符合我的需求,数据在客户端加密,发送到服务器,存储在db中,并在客户端再次解密。但我似乎无法找到一种方法来处理在我的项目中硬编码私钥的需要。为了将它保存到钥匙串,我必须从某个地方加载它,如果我生成它比其他客户端不会有相同的密钥,它将无法解密数据。所以有人帮助我,我是从错误的角度看待这个吗?

3 个答案:

答案 0 :(得分:5)

假设您使用TLS,我们可以概述您提出的以下要求:

  • 存储在服务器上的所有信息都必须加密,以免服务器泄露泄露任何数据。

  • 给定"云中的所有客户"可以访问该云中的所有数据。

  • 客户端设备丢失不会泄露云中的任何信息。

然后我们可以概述一个类似的E2E方案:

  1. 首次创建用户时,生成公钥/私钥客户端并将公钥传输到服务器。使用从用户密码生成的对称密钥加密私钥客户端。因此,任何需要此私钥的操作也需要用户密码,以防止设备被盗。

  2. 当用户希望创建"云组"时,为该组生成对称密钥并使用用户公钥对其进行加密。将此密钥存储在客户端设备上,使用用户公钥加密。

  3. 当用户想要将另一个用户添加到他们的"云组"时,使用新用户公钥加密组对称密钥并进行传输。

  4. "云组内的通信和存储"使用组对称密钥。

  5. 请注意,在此方案中:

    • 服务器无法解密任何数据,因为组对称密钥只在用特定用户公钥加密时才触及服务器。

    • 用户密码总​​是需要使用他们的私钥,因此盗窃设备不能向窃贼公开任何信息。

    • "云组"的所有用户可以使用简单的对称算法相互通信。

答案 1 :(得分:2)

您可以模仿iMessages的工作方式:https://www.apple.com/business/docs/iOS_Security_Guide.pdf

在高级别:在设备上生成公钥 - 私钥对,私钥存储在钥匙串中。公钥在服务器上注册并与用户/设备相关联。发送邮件时,服务会查找收件人的公钥并使用该邮件加密邮件,以便只有收件人才能对其进行解密。

Apple使用钥匙串,因此请按照您的意愿对其进行安全操作。

答案 2 :(得分:1)

即使私钥从客户端被盗,攻击者也只能在拥有密文的情况下解密密文。

服务器和客户端只有在彼此进行身份验证后才应发送彼此的密文。

然后,如果通过TLS连接发送数据,则额外的加密层会保护传输中的密文。