Lia*_*ath 9 .net security ajax jquery
我有一个WebService,它有几个调用只能访问该站点的成员.我想构建一个纯html/jQuery移动应用程序,可以调用此服务发出请求和下载信息.
我最初的计划是将用户的用户名和密码放在auth标头中,但我担心将它们暴露给任何流量嗅探器.我显然可以创建会话密钥,因此在初始身份验证之后,他们使用令牌调用,但这可能容易受到会话窃取的影响.
我目前的计划是:
另一个想法是在我发送密码时加密密码.基于.NET RSACryptoServiceProvider实现在JS中进行公钥/私钥加密是否可行/合理?
处理身份验证的最佳方法是什么,理想情况下无需购买SSL证书(数据本身不是特别敏感).?
除了强烈建议使用SSL的明显原因之外,如果可能,您肯定应该使用它,您可以考虑通过哈希登录和密码来提高安全性.
哈希以一种非常难以破解的方式工作 - 非常相似的字符串的哈希是完全不同的,即使你只改变一个字符.看到:
Login: "jacek", SHA1: "9749d1492af3d43f9c09e04c5c43f27bb909af51"
Login: "Jacek", SHA1: "46c676716f0e9aa86545c034d0e22a114d7cd488"
Run Code Online (Sandbox Code Playgroud)
这表明你需要一个确切的密码(或它的哈希冲突,很难计算)来"破解"哈希,而'simmilar'密码完全没用.
您的实现可能是这样的:当您创建用户(fe注册时刻)时,您计算登录名和密码的哈希值.之后,在DB中您将拥有:
Login | HashedLogin | HashedPassword
---------------------------------------------------------------------------------------------
jacek | 9749d1492af3d43f9c09e04c5c43f27bb909af51 | e4e088f4eaa96db85e11ba491a189f96f2e11793
Run Code Online (Sandbox Code Playgroud)
(您可以保留一个未散列的登录名,仅用于调试/维护目的.)
之后,在你的应用程序中连接到Web Service之前,你完全一样,但是在jQuery中:
var _HashedLogin = Sha1_Hash($("#login").text());
var _HashedPassword = Sha1_Hash($("#password").text());
Run Code Online (Sandbox Code Playgroud)
有很多第三方SHA1库,使用其中任何一个;)
然后,当您向Web服务发送信息时,仅发送散列值.即使有人嗅到你的ajax电话,他也会得到类似的东西:
"UserInfo":
{
"login" : "9749d1492af3d43f9c09e04c5c43f27bb909af51",
"pass" : "e4e088f4eaa96db85e11ba491a189f96f2e11793"
}
Run Code Online (Sandbox Code Playgroud)
这对窃贼来说没用,但您可以轻松地将这些值与数据库中的预先计算的哈希值进行比较.你可以跑
select id from Users where HashedLogin = 'login_from_your_ajax_call' and HashedPassword = 'pass_from_your_ajax_call';
Run Code Online (Sandbox Code Playgroud)
如果您获得此查询的任何结果,则您的安全验证已完成,并且您拥有用户的ID.如果没有结果,则登录名或密码无效.
出于家庭和半专业原因,SHA1非常安全,要计算会与您的密码冲突的哈希,您可能需要进行2^61比较.一台家用电脑需要几年才能打破这种局面.该解决方案仍然容易受到中间人攻击,但是通过发送明文身份验证数据是一种安全性的飞跃.
此外,请记住,即使用户通过身份验证,除非您使用SSL,否则所有其他(client <-> Web Service)连接仍然不安全且易于嗅探.