2012-05-16 57 views
1

我有一个(客户机/服务器通信)设置现在像这样:如何保护我的密码安全?

1)客户端要求用户输入用户名和通过

2)客户端使用端口80(在Web上发送这个到服务器)

3)服务器回应说这是否是正确的密码(correctpass/wrongpass),如果是正确的,它会发送一个加密密钥给客户端。

4)客户端向服务器发送一系列命令(所有命令都以服务器提供给客户端的加密密钥开始)。

5)服务器检查的encryptionKey识别客户端和响应命令

我的问题是:

这是保持安全的事情以正确的方式?我不确定是否来回发送一个加密密钥会有什么好处。它能帮助客户生成一个加密密钥并让服务器验证它吗?

我想做的事情就像Facebook用来验证应用程序一样。例如,我可以想象,Facebook做了一些事情来阻止我通过诸如wireshark或tcp分析器之类的程序窃取原始密码。

如果它很重要,我的程序是用c#编写的,并使用标准的http发送/接收数据。

感谢,

罗希特

+4

立即改进是切换到HTTPS。 – Tejs

+4

_Is这让事情变得安全_正确的方式 - 用号的用途是什么共享的秘密名/密码通过端口80 –

回答

5

将大部分的东西,你在做同样的,你可以简单地改变你的步骤

  1. 客户要求用户输入用户名和传递

  2. 客户端建立到服务器的SSL连接。

  3. 客户端通过SSL连接发送用户名和密码。

  4. 服务器响应说这是否是正确的密码(correctpass/wrongpass)。

  5. 客户端向服务器发送一系列命令(所有命令通过用于发送密码的相同SSL连接发送)。

,你正在使用一个连续的连接SSL层做了所有这些工作你看不见的幕后服务器并不需要不断重新验证用户身份的每封邮件,只要。


另一方面,Facebook并没有像你所描述的那样,他们使用OAuth。下面是OAuth的是如何工作的一个基本的例子(从雅虎的developer page

enter image description here

所以,你做第1步中每一次应用程序,你写吧,步骤2-4得到完成每一次用户到应用程序与关联他们的账户,那么你只需要执行步骤5,直到步骤4中收到的令牌到期(可能在几小时到几天之间,取决于站点)。一旦令牌到期,您只需重复步骤4(或者如果失败,则执行步骤2-4),用户可以再次使用该程序。

步骤3是他们输入密码信息的地方,但是请注意,他们正在雅虎网站上输入密码,因此您的程序永远不会触及用户的用户名和密码(这是OAuth的全部功能!)。

+0

开始? – rkrishnan2012

+0

共享密钥是用于对您的应用和OAuth提供商之间的所有消息进行数字签名的密钥。它证明你的应用程序真的是你的应用程序。它与消费者密钥不同,因为消费者密钥是提供商的应用“ID”,并且不保密。 –

+0

给一个现实世界的例子。对于您的自动取款机卡,您的银行账户号码将成为您的消费者密码(每张支票上印有该密码),但您进入自动柜员机取钱的密码是共享密码。 –

1

一对夫妇一般指针:

正如其他人所指出的,如果可能的话使用SSL。

你应该从未存储密码以明文形式。相反,请在比较之前存储原始密码的散列并重新提供所有接收到的密码。如果您不能使用SSL,请让客户在传输之前散列密码(使用MD5或类似软件)。

如果客户端是一个应用程序(不是在一个浏览器页面),但你不能使用SSL,那么客户端和服务器可以共享,可用于对传输加密秘密。这个秘密当然不会被发送,而是被用作例如AES加密。

在你的情况下,你可以使用如由共享密钥,客户端IP地址和当前命令(或其子集)组成的字符串的散列,并将哈希与命令一起传输,以便连续向服务器验证自己的身份。

但请,如果可能的话,使用SSL。