从jQuery安全地调用安全的WebService

前端之家收集整理的这篇文章主要介绍了从jQuery安全地调用安全的WebService前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个WebService,它有几个调用,只有该站点的成员可用.我想构建一个纯粹的html / jQuery移动应用程序,可以调用这个服务请求和下载信息.

我的初步计划是将用户用户名和密码放在auth标题中,但我担心会将其暴露给任何流量嗅探器.我可以明显地创建一个会话密钥,所以在他们使用令牌调用的初始身份验证之后,这可能会容易受到会话窃取的影响.

我目前的计划是:

>执行登录调用,这将返回一个在指定时间后过期的令牌
> JS使用该令牌进行呼叫(从而减少密码发送的次数).
>用户拨打电话
>将令牌与用户的IP地址进行比较.
>用户注销,结束会话,及早删除密钥以降低风险

另一个想法是在发送密码时加密密码.在基于.NET RSACryptoServiceProvider实现的JS中进行公钥/私钥加密是否可能/明智?

处理身份验证的最佳方法是什么,最好不要购买SSL证书(数据本身并不特别敏感). ?

解决方法

除了强烈推荐使用SSL的明显原因之外,如果可能,您一定要使用它,您可以通过哈希登录和密码来考虑提高您的安全性.

哈希的工作方式很难打破 – 非常相似的字符串的散列是完全不同的,即使你只改变一个字符.看到:

Login: "jacek",SHA1: "9749d1492af3d43f9c09e04c5c43f27bb909af51"
Login: "Jacek",SHA1: "46c676716f0e9aa86545c034d0e22a114d7cd488"

这表明您需要一个EXACT密码(或者是难以计算的哈希冲突)来“打破”散列,而“simmilar”则完全无用.

你的实现可能会这样:
创建用户(f.e.注册时刻)时,可以计算登录名和密码的哈希值.之后,在DB中你将拥有:

Login  | HashedLogin                              | HashedPassword 
---------------------------------------------------------------------------------------------
jacek  | 9749d1492af3d43f9c09e04c5c43f27bb909af51 | e4e088f4eaa96db85e11ba491a189f96f2e11793

(您可以保留一个unhashed登录名仅用于调试/维护).

之后,在您在应用程序中连接到Web Service之前,您完全一样,但在jQuery中:

var _HashedLogin = Sha1_Hash($("#login").text());
var _HashedPassword = Sha1_Hash($("#password").text());

有很多第三方SHA1库,使用任何一个;)

然后,当您向Webservice发送信息时,仅发送散列值.
即使有人嗅你的ajax电话,他只会得到像:

"UserInfo":
{
    "login" : "9749d1492af3d43f9c09e04c5c43f27bb909af51","pass" : "e4e088f4eaa96db85e11ba491a189f96f2e11793"
}

这对于小偷而言是无用的,但是您可以轻松地将这些值与数据库中的预计算哈希进行比较.你可以跑

select id from Users where HashedLogin = 'login_from_your_ajax_call' and HashedPassword = 'pass_from_your_ajax_call';

如果您获得此查询的任何结果,则您的安全验证完成并且您具有用户的ID.如果没有结果,登录名或密码无效.

SHA1对于家庭和半专业原因来说是相当安全的,为了计算将与您的密码相冲突的哈希值,您最多可能需要2 ^ 61次比较.家庭电脑将要花上几年的时间才能打破这一点.该解决方案仍然容易受到中间人攻击,但是从发送明文认证数据的安全性是一个跨越.

此外,请记住,即使用户进行身份验证,除非您使用SSL,否则所有其他(客户端> Web Service)连接仍然不安全且易于嗅探.

猜你在找的jQuery相关文章