2010-05-09 110 views
5

因此,我正在开发一个移动平台应用程序,我希望用户通过网络进行身份验证。我想知道做安全的最好方法。用户正在向HTTP服务器发送一个密码给一个php服务器,这个服务器需要在同一台服务器上对一个mysql数据库进行验证。很明显,我不想通过互联网以纯文本的形式发送密码,但我也不想做2次SHA哈希。通过网络发送密码

这是服务器看起来像(伪代码)

$pass = $_POST['pass']; 

if ((get PASSWORD where USERNAME = USERNAME) == SHA($pass)) return PASS; 

这是非常标准的,我不认为有任何其他的方式来做到这一点。但我想知道如何在通过互联网发送数据之前准备数据。

回答

10
  1. 如果你想要安全,你。必须。使用。 HTTPS。拥有适当的非自签名证书。不管你做什么,通过未加密通信进行身份验证的身份都是微不足道的。 (不要介意密码,攻击者可以简单地窃取随每个请求提供的会话cookie。)
  2. 散列本身是毫无价值的,你必须用它来骗取它。 (这与认证无关 - 当有人窃取你的数据库时,这是第二层防御措施,如果你成为一个有前途的目标,迟早会发生这种情况。)使用长随机每用户盐的bcrypt,沙*由于速度太快而不安全。
  3. 使用大型安全感知项目已在使用的方法。这些方法在一定程度上经受住了时间的考验。有一些基于challange-response的方法可以避免以任何形式发送密码,但是加密非常困难,并且非常容易以不安全的方式实现安全算法。使用良好的安全框架(例如PHPass),不要依赖未广泛使用的代码。
+0

+1比我的更详细的答案。 – 2010-05-09 11:24:46

+0

谢谢你们的答案。我对Web编程不太熟悉,我想是时候研究一下安全问题了。是否有任何指南可以让我看到这些技术如何协同工作的整体情况?只是为了获得更多信息,这是一个android程序,用户必须在应用程序中创建用户名/密码,然后我将为用户实现一个Web界面,以便能够与手机进行交互。所以通过互联网发送密码的唯一时间是用户创建。 – Falmarri 2010-05-10 14:32:22

4

如果您的客户端应用程序支持它,则可以使用SSL

0

正如Pekka指出的那样,SSL是您的最佳选择。

作为一种替代方案,在JavaScript中使用SHA非常简单,快速,并且它已经被编写。 Here's an example这里是一个库:crypto.js

+0

没有必要自己实现它。有很好的libs已经这样做了。例如Crypto.js,我在这里写下了它:http://techpriester.tumblr.com/post/547863016/crypto-js-by-jeff-mott – selfawaresoup 2010-05-09 09:41:14

+0

我向上帝发誓,我的链接中有一个示例库;)让我改说一下,所以它更清晰。 – 2010-05-09 10:04:24

0

对于普通的非关键系统,大多数网站在发送http请求时通过Internet以纯文本格式发送密码。然后通过SHA1/MD5对密码进行服务器端编码,并根据数据库中的值进行检查。

您也可以使用https basic authentication,这将使用简单的算法对密码进行编码。但是,虽然它不以纯文本发送密码,但编码非常简单,非常容易破解。但通过使用基本身份验证,您不能使用常规登录表单,您需要使用浏览器对基本身份验证的支持(用户界面不太友善!)。

如果您需要更多安全性,大多数网站只需安装您在ISP购买的服务器端SSL证书(例如godaddy)。这将使您可以通过SSL加密连接访问您的登录脚本。此解决方案被认为是安全的(只要密码不容易被猜出或被盗)。

另一个有趣的但不常见的方法是在对服务器(JS sha-1 example)执行(Ajax)发布请求之前,在JavaScript中执行SHA1编码。从理论上讲,这可以提供相当合理的安全...

如果这一切仍然不够,你可以考虑安装client certificates或一个计算器或短信的响应挑战系统。

+3

我不同意在发送之前进行sha1编码。这样sha1散列只是作为密码,任何嗅探网络流量的人都可以将散列发送到服务器而无需知道原始密码。此外,这使得不支持JS的人无法访问它,或者这意味着您的服务器必须检测发送了哪种密码(散列或不散列)。 – 2010-05-09 10:09:47

+3

服务器可以发送盐,客户端可以计算盐渍散列,附加一个随机字符串,再次散列,发回第二个散列和随机字符串,服务器可以通过将随机字符串附加到存储的密码散列并再次散列。拉(你需要两个登录请求)有点复杂,但是对于可以监控通信但不能拉中间人攻击的攻击者是合理安全的。当然,无论如何,他会窃取会话cookie。 – Tgr 2010-05-09 11:15:19

+0

@Tgr:随机字符串的第二个哈希如何帮助使事情更安全?如果第一次散列(散列密码+盐)容易受到重放攻击,则第二个散列根本无济于事,因为攻击者将重放相同的“随机”字符串。 – 2010-05-09 11:55:41