您提出的“签名”解决方案需要客户端行为 - 因此您需要一个可以进行签名的客户端应用程序。
如果您正在编写 Flash/Java 小程序/Unity 或任何这些插件,那么您可以按照您的计划进行,因为您可以更密切地控制客户端并添加例程来进行签名。
但是我假设您在不使用插件的情况下将 HTML 页面传递给浏览器?如果是这样,你有两个选择,真的。拳头是 SSL(您正在排除),因为它内置在浏览器中。第二个是Javascript。为了获得最大的安全性,您需要以某种方式模仿 SSL,包括客户端存储加密(公共)密钥/算法(这样它们就不会与消息一起传播)。您希望尽可能接近 SSL 的公钥/私钥 + 握手 - 这绝非易事。正如 sarnold 所建议的,您需要一个强大的加密密钥。查看http://www.jcryption.org/以获取示例 - 其他人使用谷歌搜索出现。
如果这有点过分,您最可行的解决方案可能会使用 JS 协商一个更简单的加密算法:您发送一个“密钥”,将“密钥”存储在浏览器上的 cookie 中,所有通信都通过 AJAX 并创建一个基于该密钥的更简单的签名机制(可能加上客户端在初始握手期间与您共享的另一个变量)。任何不解码或不匹配密钥的内容,然后终止整个会话并重新开始。
sarnold 在他的回答中提出了要避免使用 md5 和 SHA-1 的优点;有些人甚至认为 SHA256 在当今的计算机上越来越受欢迎,但考虑到您需要在 JS 中实现解决方案,为了提高速度,您可能会与 md5 之类的“平淡无奇”(我的比喻)联系在一起。因此,您对此的最佳防御是准确的日志记录和蛮力/错误检测。任何到达时出现乱码的消息(您可以在任一端检查)都应该被记录和监控。失败太多,IP 地址被禁止 - 并继续记录。