C# 如何确保密码的安全?

C# 如何确保密码的安全?,c#,networking,communication,C#,Networking,Communication,我现在有一个(客户端/服务器通信)设置,如下所示: 1) 客户端要求用户输入用户名和密码 2) 客户端使用端口80(通过web)将其发送到服务器 3) 服务器响应说这是否是正确的密码(correctpass/errowpass),如果它是正确的,它将向客户端发送加密密钥 4) 客户端向服务器发送一系列命令(所有命令都以服务器提供给客户端的加密密钥开始) 5) 服务器检查encryptionKey以识别客户端并响应命令 我的问题是: 这是保证安全的正确方法吗?我不确定来回发送一个加密密钥是否有任何

我现在有一个(客户端/服务器通信)设置,如下所示:

1) 客户端要求用户输入用户名和密码

2) 客户端使用端口80(通过web)将其发送到服务器

3) 服务器响应说这是否是正确的密码(correctpass/errowpass),如果它是正确的,它将向客户端发送加密密钥

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

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

我的问题是:

这是保证安全的正确方法吗?我不确定来回发送一个加密密钥是否有任何好处。让客户端生成一个加密密钥并让服务器验证是否更有帮助

我想做的就是像facebook那样验证它的应用程序。例如,我可以想象facebook做了一些事情来防止我通过wireshark或tcp analyzer之类的程序窃取原始密码

如果有必要的话,我的程序是用c#编写的,并使用标准http发送/接收数据

谢谢


Rohit

要使您正在做的大部分事情保持不变,您只需将步骤更改为

  • 客户端要求用户输入用户名和密码

  • 客户端建立到服务器的SSL连接

  • 客户端通过SSL连接发送用户名和密码

  • 服务器响应说这是否是正确的密码(correctpass/errowpass)

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


  • 服务器不需要在每条消息中不断地重新验证用户的身份,只要您使用一个连续连接,SSL层就会在幕后无形地为您完成所有这些工作


    另一方面,Facebook所做的和你所描述的完全不同,他们使用的是。下面是OAuth工作原理的一个基本示例(来自雅虎)

    因此,在编写应用程序时,每个应用程序执行一次步骤1,每个用户执行一次步骤2-4,将应用程序与其帐户关联,然后只需执行步骤5,直到在步骤4中收到的令牌过期为止(可能是几小时到几天,具体取决于站点)。一旦令牌过期,您只需重复步骤4(如果失败,则重复步骤2-4),用户就可以再次使用该程序


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

    要保持您正在做的大多数事情不变,只需将步骤更改为

  • 客户端要求用户输入用户名和密码

  • 客户端建立到服务器的SSL连接

  • 客户端通过SSL连接发送用户名和密码

  • 服务器响应说这是否是正确的密码(correctpass/errowpass)

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


  • 服务器不需要在每条消息中不断地重新验证用户的身份,只要您使用一个连续连接,SSL层就会在幕后无形地为您完成所有这些工作


    另一方面,Facebook所做的和你所描述的完全不同,他们使用的是。下面是OAuth工作原理的一个基本示例(来自雅虎)

    因此,在编写应用程序时,每个应用程序执行一次步骤1,每个用户执行一次步骤2-4,将应用程序与其帐户关联,然后只需执行步骤5,直到在步骤4中收到的令牌过期为止(可能是几小时到几天,具体取决于站点)。一旦令牌过期,您只需重复步骤4(如果失败,则重复步骤2-4),用户就可以再次使用该程序


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

    几个通用指针:

    正如其他人指出的,如果可能,请使用SSL

    永远不要以明文形式存储密码。相反,存储原始密码的散列,并在比较之前重新散列任何接收到的密码。如果不能使用SSL,请让客户端在传输之前对密码进行哈希处理(使用MD5或类似工具)

    如果客户端是应用程序(不是浏览器中的页面),但不能使用SSL,则客户端和服务器可以共享可用于加密传输的机密。当然,该秘密永远不应发送,而应在AES加密中用作密钥

    在您的场景中,您可以使用例如由共享机密、客户端IP地址和当前命令(或其子集)组成的字符串哈希,并将哈希与命令一起传输,以便持续向服务器进行身份验证


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

    一些常规指针:

    正如其他人指出的,如果可能,请使用SSL

    永远不要以明文形式存储密码。相反,存储原始密码的散列,并在比较之前重新散列任何接收到的密码。如果不能使用SSL,请让客户端在传输之前对密码进行哈希处理(使用MD5或类似工具)

    如果客户端是应用程序(不是浏览器中的页面),但不能使用SSL,则客户端和服务器可以共享可用于加密传输的机密。当然,该秘密永远不应发送,而应在AES加密中用作密钥

    在您的场景中,您可以使用例如由共享机密组成的字符串哈希,即cl