公钥和私钥加密交付

时间:2018-06-27 18:29:03

标签: python encryption

我对服务器上的加密有疑问。 因此,我正在建立一个聊天/邮件系统,用户可以在其中彼此发送消息。 在发送消息之前,我在后端运行一个对消息进行加密的脚本,我的问题与解密有关。 在我的数据库中,我有一个表来保存加密的消息,我不希望我的数据库保存任何解密的消息。如何在不将任何解密消息保存在服务器上的情况下将解密消息发送给用户? 谢谢。

1 个答案:

答案 0 :(得分:0)

您的问题几乎肯定会被误导。通常,您不想加密从一个用户到服务器上另一个用户的消息,并且几乎永远都不想在服务器上解密它们。


首先,公钥加密的全部要点是,除了用户和他们自己的受信软件之外,没有人可以访问用户的私钥。

您不想将用户的私钥存储在服务器上–这意味着,如果您的服务器被黑客入侵,或者某些心怀不满的员工想要破坏您的公司,他们可以解密世界上的每条消息。大多数用户不会信任这样的系统,他们也不应该。

因此,您必须在可以访问其私钥的接收用户的客户端上进行解密。


通常,您还希望在发送用户的客户端上进行加密。否则,每封邮件都将以纯文本格式发送到服务器,黑客(或不道德的服务器公司)可以在此位置轻松窃取该邮件,然后再对其进行加密。同样,用户不会也不应该相信这样的设计。

这当然意味着发送方客户端需要接收方的公钥。但这很容易管理:您将每个人的公共密钥存储在服务器上,并添加一个命令,发送方的客户端可以使用该命令来获取收件人的公共密钥。

在某些设计中,您想使用单独的带外机制来共享公共密钥。例如,如果您使用的是GPG,并且希望依靠其信任网络而不是使用服务器来管理对身份的信任,则可以为客户端提供一种导入并存储公钥的方法,或者提供一种与现有密钥库进行交互的方式。


如果您真的想完全在服务器上进行PK加密,则可以。只是并没有提供太多的安全益处。

为此,您可以将每个用户的私钥存储在数据库中。然后,您只需获取加密的消息和私钥,并在发送之前对其进行解密。然后,纯文本仅在某些短期内存缓冲区中可用,而不在数据库中可用。但是请注意,这并不比完全不加密任何内容更好。当然,可以访问您的数据库的任何人都不能直接获得解密的消息,但是他们可以获得加密的消息和解密它们所需的密钥,这同样好。实际上,对于攻击者来说,这是更好的,因为现在他们可以使用相同的私钥解密其他消息,对消息进行模仿以模拟用户,等等。

或者,您可以让用户每当要提取消息时都提交私钥。然后,您将加密的消息从数据库中拉出,使用私钥对其解密,然后将其发送给用户。现在,私钥和纯文本都仅驻留在临时内存中。但这几乎不添加任何内容,而不是完全不加密。消息(以及更糟的是私钥)以明文形式在开放的Internet上传播。另外,任何能够入侵您服务器的人都无法将私钥从数据库中拉出,但是他们只能在私钥进入时对其进行存储。