我不确定这个问题是否更适合 StackOverflowSE 或 CryptoSE,但我认为这是正确的地方。
在一个在线社区门户中,我想将用户的私人消息加密保存在数据库中,这样如果有人访问数据库,信息就不会泄露。但我不知道如何管理密钥。
发送消息时,应将其加密保存在数据库中,并且只有在其中一个参与者请求消息时才能解密。密钥显然不能保存在数据库中,因为这会使整个事情变得毫无意义。
我想出的方法是使用对称密钥算法保存消息,并为每个参与者保存使用公钥算法加密的密钥(每个用户都有一个公钥)。
当请求消息时,使用用户的私钥对其进行解密以获取对称密钥。但是我不知道如何创建/保存私钥。它不能在数据库中,并且由于应用程序是多平台的(网络、移动访问),我无法将其保存在用户的设备上,并且必须使用来自用户的常量动态生成,而不是保存在数据库的某处。我能想到的唯一常量是用户的密码。但是,如果密码丢失/忘记,则无法再访问这些消息。
我的问题:还有其他方法可以做到这一点吗?或者你知道另一个仍然是私有的常量吗?
编辑/更新: 感谢您的回答。这是一个更新:
如何将私钥保存在使用随机字符串加密的 db 中,该字符串在注册时通过邮件发送给用户?建议用户不要删除该邮件。如果她仍然这样做(似乎很有可能),那么我可以责怪她,没有 j/k,但这至少是恢复消息的一种方法。
这里有一个子问题:应用程序只能通过 HTTPS 或 TCP/IP+SSL API 访问。是否可以保存在服务器上对消息进行加密/解密并通过 SSL 以普通方式发送它?否则,我将不得不为所有平台(浏览器、移动设备、桌面)寻找实现(如 GPG)。这需要在用户登录时将私钥存储在 ram 中(密码在会话开始/登录时发送)。当然,如果有人获得对服务器的写访问权(更改应用程序)或对 ram(o0)的读访问权,他可以嗅探密钥,但我认为这不太可能。
无论如何,消息必须在服务器上*加密*(意味着以明文形式发送),因为它可能需要由服务器推送到移动设备。(这是否安全并不重要,我想确保没有人可以使用数据库转储 - 如果 Apple 或类似公司可以在交付时读取它,则不然)。
可能我不需要这些,因为我的用户很可能不会互相发送秘密消息,但万一发生泄漏,他们不会高兴的。这是一个本地学生社区,你永远不知道无聊的 CS 学生在做什么;)。