我正在尝试使用URL参数(对于内部SSO服务器)将JSON字符串从一个Web应用程序传递到另一个Web应用程序。
我需要做的是能够使用预共享密钥加密JSON字符串(用户有效负载对象),将用户转发到服务提供者应用程序,并将有效负载作为URL参数附加,然后再打开服务提供者应用程序将有效负载解密回JSON字符串以获取所需信息。
现在,由于所有PHP内置的加密功能,这一部分并不是一个问题,但下一部分是难点。我需要在加密字符串中嵌入校验和,在解密时可以检查它,这样如果它在传输过程中被修改,那么我可以引发异常。
这样做的目的是确保用户有效负载在传输过程中未被意外或故意修改。
答案 0 :(得分:2)
您希望提供超过"校验和" (通常定义为"可由任何一方计算");您想提供身份验证标记或消息身份验证代码(MAC)。你有几个选择:
hash_equals
来执行此操作。这是quick explanation of timing attacks和code review of a PHP example。 对于任何一种选择,您都希望使用URL安全的Base64对生成的密文和身份验证标记进行编码,以避免数据丢失或损坏。如果您的消息格式没有严格按照包含长度进行结构化,则您必须提前预先共享协议(即,对于长度 n 字节的消息 m - > 16 bytes IV | n-48 bytes cipher text | 32 bytes HMAC
)。
最后一点:始终对每个使用密钥加密的邮件使用唯一的,不可预测的IV。很多人都对此有所了解,因为它很容易使用0x00
* 16",但任何流密码操作模式如CTR
用作GCM的基础如果两条消息使用相同的IV和密钥加密,CCM将失去基本安全性。