我有一个包含/ UserService / Register URI的RESTful API。 / UserService / Register接受XML请求,例如:
<UserRegistrationRequest>
<Password>password</Password>
<Profile>
<User>
<UserName>username</UserName>
</User>
</Profile>
</UserRegistrationRequest>
鉴于上述情况,我有以下问题:
是否有办法(使用C#和.Net 3.5+)强制/验证调用Register的客户端是否传递了哈希密码而不是明文?是否将选择散列算法用于客户端是一个好主意?
我们可以提供/ UserService / ComputePasswordHash的第二个URI,客户端在调用/ UserService / Register之前会调用它。这有利于确保使用相同的算法对每个密码进行哈希处理。 REST中是否有一种机制可以确保客户端在调用另一个URI之前调用了一个URI?
希望我已经解释好了。
非常感谢您的任何帮助。
答案 0 :(得分:3)
在REST服务中传递散列密码并不比清除密码更安全。如果密码被嗅探,它是否散列并不重要,可以使用它。
最好的办法是在服务器上散列密码并仅接受安全连接(SSL / https)
答案 1 :(得分:0)
让客户端自己散列密码是个坏主意。一般来说,散列仅密码不是很安全:必须将随机盐附加到密码,以便相同的密码将产生不同的散列值。有了这个,客户端将不得不生成salt(最好使用加密安全算法),计算产生的sting的散列(使用众所周知的散列算法的兼容实现),然后将三条信息发送回服务器:
如果服务器没有特定散列算法的实现怎么办?如果客户端哈希算法与服务器哈希算法相比产生不同的结果会怎样?
现在回到你的问题:
byte
数组的此字符串是否包含非可打印字符,这些字符很可能出现在哈希值中。虽然他们可能不在那里ComputePasswordHash
的回复中添加某种令牌,然后要求您的客户将此令牌传回Register
答案 2 :(得分:0)