首页 > 解决方案 > 在密文公开的Java中加密消息的最佳方法

问题描述

我正在用 Java 编写一个应用程序,用户必须能够共享加密消息,并且通信仅通过所有数据公开可见的数据库进行。

要求大致如下:

哪种加密算法或算法组合最能满足这些要求?我假设某种形式的非对称加密算法,每个用户都有一个公钥/私钥对,但欢迎替代想法。不过,我绝对想避免“滚动你自己的加密货币”陷阱......

标签: javaalgorithmencryptioncryptography

解决方案


你(几乎)总是推出自己的协议。这通常是黑客所在的地方。

现在,如果您要推出自己的算法(例如,避免使用 AES-256,并自己编写一些东西。我们将通过重复应用“OhWowThisIsTheBestSecurityEvar”对每个字节进行异或,就像一个-time pad 对,不能被破解!-那种想法就是整个“不要滚动你自己的加密货币”模因的全部内容。不要那样做。

即使您使用现成的“协议”,也很容易搞砸并造成漏洞。协议方面(你如何使用加密算法)本质上不容易抽象成一个单一的、难以滥用的预建库。

所以,自己动手吧。协议就是。

这里看起来几乎是微不足道的——但事实并非如此。基本工作是以通常的方式使用公钥/私钥加密,使用对称加密(例如 AES-256)加密消息,生成随机 IV随机密钥,并将两者存储在数据库中,但密钥是存储加密 - 使用公钥/私钥加密进行加密。

也就是说,就其核心而言,足以满足您的要求。但是,重放攻击呢?可能过于热心或难以置信,但如果我可以将内容写入您的数据库怎么办?我可以重播这条消息:存储完全相同的加密字节球,但时间戳不同,你会认为它是真实的。

这正是这些协议中的一个:如果您在要加密的 blob 中包含时间戳、发件人等,这会有所帮助-希望重放攻击是无害的,并且通常,如果消息(包括元数据)是准确的,完全相同,应该是。也许。通常。这取决于您的用户期望什么以及他们将使用它的目的。毕竟,没有完美的加密货币。但是,即使这是不可接受的,也有解决方案,尽管简单的方法是确保没有人对数据库具有原始 SQL 级别的写访问权限。

如果您的系统被“黑客入侵”,它几乎总是在二级“协议”位中。我可以打电话给你的服务台并模拟用户吗?我可以说我丢失了密码并收到一个新密码邮寄给我,然后“只是”破解用户的电子邮件吗?我可以在他们的计算机中粘贴键盘记录器吗?也许在停车场周围乱扔一些带有 RAT 蠕虫的 U 盘;一个 RAT 蠕虫,专门用来查找他们的密钥文件,在输入密钥文件的密码时抓住他们,然后全部发送给我?没有任何“现成的 Java 库”可以保护您免受任何此类伤害。你不能在“我真的不知道我在做什么,但我至少我知道我不知道所以我”中做安全 我会确保获得一个社区和专家推荐的图书馆,并尽可能地遵循它的手册,我肯定会没事的!- 一种时尚。如果您认真对待它,则不会。

您可能应该使用的一些算法:

  • BouncyCastle 支持 ElGamal,一种公钥/私钥加密方案。这个想法是所有用户都有一个公钥和私钥;您的服务器(以及所有需要的用户)都知道公钥;您的服务器是他们的票据交换所,并且必须保证真相,也就是说,如果您说:“这是用户 Foo 的公钥”,您'保证这是真的,并且可能保证您网站上用户 Foo 的个人信息是正确的。如何-这取决于您,与加密无关,但与政治和本地流程有关。您打电话给他们吗?他们用护照来表明自己的身份吗?什么?只有他们知道私钥。您需要手动执行某种失效方案。也许用户可以指定其他一些用户 - 然后他们有权使他们的密钥失效。这个想法是,

  • 请注意,如果您想将其用于上述担保系统,您必须找到一种方法来使用您拥有的 Ed25519 密钥对。

  • 将 AES-256 与您的飞机简基本版一起使用new SecureRandom()为要存储在系统中的每条消息生成一个密钥。要存储消息,您获取数据,生成随机密钥,使用该密钥和 AES-256 算法加密数据,存储加密数据,然后使用 ElGamal 和用户的公钥加密密钥,并将其存储. 为了解密这些数据,用户获取(用他们的公钥加密的)密钥数据(可以是公开的)和加密的数据(也是公开的),并且可以通过首先使用他们的私钥 + ElGamal 来撤销他们的工作导出使用的随机生成的 AES-256 密钥,然后使用它。您不会使用 ElGamal 加密整个消息;这很慢,而且不是常见的方法。AES-256 速度非常快。但对称。你需要一个“块模式”和一个“填充模式” 除了算法(将是 AES-256)之外的加密。块模式应该是 GCM;您可以阅读有关 CBC 的信息;那是过时的(更糟,更慢)。绝对不要选择欧洲央行,那是不安全的。填充可能无关紧要,像往常一样取决于很多因素。

  • 你没有提到签名。如果用户“Foo”想以除 Bar 之外的任何人都无法阅读的方式向用户“Bar”发送消息,那么他们所要做的就是上述内容。但如果他们这样做了,“酒吧”绝对不知道是谁发来的。GCM 有一些对 MAC 的内置支持,这就是您需要以发件人可以证明他们实际上是发件人的方式标记消息,以及标记日期和时间,尽管这并不容易;基本上,作为服务器的你会用“我,服务器,法令”来标记任何消息,你必须相信我,这在这个时间点出现在数据库中并且最近出现;反正对我来说。签名,服务器'。

这会给你一些术语(MAC、GCM、AES-256、ElGamal、Bouncy Castle、签名等等)来搜索和阅读互联网。


推荐阅读