我的应用程序需要服务器和客户端设备之间的安全消息传递。这些设备没有直接的互联网连接,因此不可能使用标准的HTTPS或MQTT连接。
我更喜欢的方法是使用不对称认证加密,例如libsodium的crypto_box API。这些设备将使用它们的私钥和服务器的公钥加密和验证消息。服务器将使用其私钥和设备的公钥进行同样的操作。
为了安全起见,我认为服务器私钥需要由KMS来管理。我正在使用Google Cloud平台作为后端,我看不到让GCP KMS解密和验证由using加密的消息的方法: GCP KMS似乎不支持using的密钥算法,也似乎不支持经过身份验证的加密。
我喜欢like,因为它在我选择的嵌入式平台上得到了很好的支持,我喜欢GCP KMS,因为我在后端使用GCP。这两者似乎主要是为了处理自己加密的消息而设计的。
是否有办法在设备上使用while,同时维护GCP KMS中的服务器私钥?还是需要另一种方法?
发布于 2022-07-19 16:34:33
versa的密码箱使用X25519同意使用一端的私钥和另一端的公钥(反之亦然)。然后,它使用派生密钥和随机密钥对消息进行加密,使用对称的认证流密码(Salsa20)对消息进行加密。(此密钥交换恰好提供了相互认证-两端都需要它们的私钥。可以将其分解为各个部分,以便执行一次成本较高的EC部件,并将派生的密钥重新用于多个消息。)
正如您已经发现的,ECDH不受支持(尽管有人曾经打开过一个特征请求 )。
与Cloud支持的非对称密钥相反,它只是解密(和签名)。(加密留给客户端,客户端可以获取公钥,并且它本身也能获得公钥。)
因此,如果服务器私钥要在KMS中保持安全,您所能做的就是加密和解密小的纯文本/密码文本。
你可以模仿密码盒的许多部分,你有什么可用的。要加密消息:生成随机密钥和IV,使用经过验证的对称密码(例如Salsa或AES-GCM),对接收方的公钥中的随机密钥进行加密,并发送加密密钥IV和密文。与密码箱一样,您可以通过发送加密密钥一次并将其用于多条消息(当然,每次使用不同的IV )来将其分区。
在服务器端,您需要RSA加密(用KMS解密)和对称密码。在客户端,您需要RSA加密、解密和相同的密码。利伯纳有AES-GCM,所以这似乎是个不错的选择。
但你在客户端还没找到RSA。寻找替代的C解决方案(例如libtomcrypto或Oryx Open)。您可能会发现,无论您需要什么RSA也碰巧做的AES-GCM也。
https://stackoverflow.com/questions/72998471
复制相似问题