我正在开发一个利用面向服务架构的新站点,前端使用纯 JavaScript,通过 RESTful AJAX 调用访问 Web 服务以获取数据。
它不应该特别重要,但我的堆栈是:
- javascriptMVC
- jQuery
- 引导程序
- ASP.NET Web API(.NET 4.0 上的 C#)
- 微软 SQL
从这篇文章中,我找到了一些在客户端 (JavaScript) 和服务器(通过 Web API 的 REST 服务)之间共享私钥后保护 Web 服务调用的好方法。但是,我正在为如何建立用于加密的私钥而苦苦挣扎。
坏主意#1
最初的设置是在登录时通过 HTTPS 进行设置,然后将其存储在客户端的 cookie 中以供重复使用。问题是我们的 SSL 证书适用于https://secure.example.com,而我们的网站位于http://www.example.com - 所以我无法访问 secure.example.com cookie来自 www.example.com。
坏主意#2
我的下一个想法是通过 URL 参数将其加密并签名,从 HTTPS 登录到 HTTP 登录后页面,如下所示:
http://www.example.com/processLogin?key=[encryptedKey]&sig=[encryptedSig]&user=[userid]
encryptedKey 和 encryptedSig 都将使用另一个仅针对该交易存在的私钥进行加密。它将在登录时创建并分配给数据库中的该用户。在 HTTP 端,所有这些都被传递到解密它的服务器,验证签名,删除该私钥(以防止重放攻击 - 本质上是一个随机数)并返回解密的私钥([encryptedKey]
解密)。
从那时起,解密后的值[encryptedKey]
将用于所有未来的交易。问题是解密的私钥必须通过 HTTP 通过线路发送,这很糟糕。
坏主意#3
我还短暂地想到在 JavaScript 中有一个硬编码的密钥,用于解密这个值,但无论我如何尝试和混淆它,黑客都可以找到并使用它。
坏主意#4
我还考虑过在初始握手时使用公钥加密进行某种密钥交换,但如其他地方所述,除非结束,否则您不能在客户端真正确信在初始握手期间没有篡改SSL - 让我回到第一方。
大问题
那么,你们如何在不通过 HTTPS 的情况下管理这些事情呢?我的 HTTP 和 HTTPS 是否必须具有相同的域名,以便我可以将此私钥存储在 cookie 中?
请注意,该站点的非 SSL 部分不会共享信用卡或登录信息等。我只是不想让这个傻瓜敞开。