如果我将密钥写入客户端的硬件令牌并将密钥保存在服务器中,我应该选择RSA还是AES



我为我的客户端提供了一个工具产品和一个硬件令牌。我的服务器会定期发送一些消息来命令该工具。该工具读取硬件令牌中的密钥,并在收到消息时验证我的消息。该工具永远不会将任何数据传递给我。

业务要求不允许该工具发送任何数据。我想加密从服务器到工具的消息,它的长度小于100个字母。加密效果对我来说并不重要。

我正在考虑RSA或AES。

AES是一种安全的对称密钥算法。但是,如果硬件令牌密钥失败,我的客户端可以向该工具发送任何命令。(尽管不太可能发生(

如果我使用RSA,我可以生成两个密钥,并且我将这两个密钥都视为私钥。我为我的客户端在硬件令牌中写入一个密钥,并将该密钥保存在我的服务器中。即使硬件令牌密钥中断,我的客户端仍然无法向该工具发送任何命令。我的客户端最多可以解析我的消息。所以对我来说,使用RSA比AES更好,是吗


这是一个可行的解决方案吗?:

我在工具中保存了一个固定的硬编码RSA公钥,并将AES私钥写入客户端的设备令牌中。我在服务器中保存了一个固定的硬编码RSA私钥,并在数据库中保存了相同的AES私钥(与客户端的AES相同(。当来自服务器的semd消息时,先用AES加密,然后用RSA加密。

因此,即使AES密钥被破坏,我的客户端仍然无法向该工具发送任何命令(因为RSA(。我的客户端最多可以解析我的消息(使用RSA公钥和AES私钥(。

谢谢!

即使硬件令牌密钥中断,我的客户端仍然无法向该工具发送任何命令

这不是真的,因为RSA公钥可以从私钥中简单地派生出来,而您的客户端拥有该私钥。然后,客户端可以使用从您放入工具的客户端密钥派生的公钥来加密命令。

您可以使用两组RSA密钥:

  1. 加密集。把私钥放在你的工具里。使用公钥对发送到该工具的命令进行加密。使用工具中的私钥对命令进行解密。这实际上只是混淆了命令——客户端可以访问该工具,所以如果他们真的想访问,他们可能会弄清楚命令是什么。

  2. 签名集。使用第二个RSA密钥对对数据进行签名。保留私钥,并使用它对命令进行签名,然后将此密钥对中的公钥放入工具中,并使用其验证签名的命令是否真实。如果该命令未由您的私钥(您保留私钥!(签名,则该命令无效。

您应该首先使用第一个RSA对的公钥加密您的命令,然后获取该结果并使用第二个RSA密钥对的私钥对其进行签名,然后将命令和签名发送到您的工具,该工具将首先使用第二对RSA的公钥来验证加密的命令是否真实,然后使用第一密钥对的私钥来解密该命令。

我假设所有命令都足够小,可以使用第一个RSA密钥对的公钥进行加密。由于RSA填充,RSA加密被限制为密钥本身的大小*减去一些字节。IIRC PKCS#1.5(旧的,但仍然是许多实现的默认值…(填充是11字节,而用于哈希和掩码生成函数的SHA-256的OAEP填充需要66字节的填充。因此,如果使用PKCS#1.5填充,或者使用SHA-256/SHA-256的190字节OAEP填充,2048位(256字节(RSA密钥可以加密多达245字节的数据。

现在,你的客户可以物理访问你的工具——如果他们真的知道自己在做什么,他们可以完全控制它,让它运行他们想要的任何命令,而且你真的没有什么技术上的办法。你只需要让它变得很难,这样就不值得付出努力(而且,重要的是,足够难,这样他们就不能说"嗯,这是一个意外。我们不是想花四个月的时间拆开你的工具,对它进行逆向工程,然后从我们从你的工具上物理删除的EEPROM中提取和分解你的代码。"(,在你的许可协议中加入一些关于客户不会入侵你的工具的内容,这样如果他们无论如何都入侵了你的工具,就会给自己带来法律问题。

*-实际的RSA加密限制是RSA公钥模数的值,但使用填充会导致较小的限制。

最新更新