是否可以将密码输入字符串确定为明文或哈希?

时间:2010-03-31 09:37:08

标签: c# .net rest passwords hash

我有一个包含/ UserService / Register URI的RESTful API。 / UserService / Register接受XML请求,例如:

<UserRegistrationRequest>
  <Password>password</Password>
  <Profile>
    <User>
      <UserName>username</UserName>
    </User>
  </Profile>
</UserRegistrationRequest>

鉴于上述情况,我有以下问题:

  1. 是否有办法(使用C#和.Net 3.5+)强制/验证调用Register的客户端是否传递了哈希密码而不是明文?是否将选择散列算法用于客户端是一个好主意?

  2. 我们可以提供/ UserService / ComputePasswordHash的第二个URI,客户端在调用/ UserService / Register之前会调用它。这有利于确保使用相同的算法对每个密码进行哈希处理。 REST中是否有一种机制可以确保客户端在调用另一个URI之前调用了一个URI?

  3. 希望我已经解释好了。

    非常感谢您的任何帮助。

3 个答案:

答案 0 :(得分:3)

在REST服务中传递散列密码并不比清除密码更安全。如果密码被嗅探,它是否散列并不重要,可以使用它。

最好的办法是在服务器上散列密码并仅接受安全连接(SSL / https)

答案 1 :(得分:0)

让客户端自己散列密码是个坏主意。一般来说,散列密码不是很安全:必须将随机盐附加到密码,以便相同的密码将产生不同的散列值。有了这个,客户端将不得不生成salt(最好使用加密安全算法),计算产生的sting的散列(使用众所周知的散列算法的兼容实现),然后将三条信息发送回服务器:

  • 哈希算法名称
  • 哈希密码

如果服务器没有特定散列算法的实现怎么办?如果客户端哈希算法与服务器哈希算法相比产生不同的结果会怎样?

现在回到你的问题:

  • 您可以强制使用Base64编码发送密码,然后检查转换回byte数组的此字符串是否包含非可打印字符,这些字符很可能出现在哈希值中。虽然他们可能不在那里
  • 您可以在ComputePasswordHash的回复中添加某种令牌,然后要求您的客户将此令牌传回Register

答案 2 :(得分:0)

哈希不是个好主意。更好的方法是使用SSL或在.NET框架中使用公钥加密api自己使用它的子集。

您将公开函数GetPublicKey(),该函数将返回用户将加密密码并将其发送给您的公钥。然后使用您的私钥解密它。并检查它是否正确。 RSA或Elliptic曲线基础公钥alogs非常好。只需使用1024位。

更新: 从msdn

检查此example以及this