安全验证客户端与服务器之间的身份

4
系统规格: C#客户端使用.NET 3.0。WCF服务作为Windows服务托管在应用服务器上。MSSql Server 2008R2 DB用于数据存储。
用户密码的哈希值存储在数据库中,用于验证用户身份。我的问题是,我不知道如何使用客户端密码的哈希值安全地验证客户端与服务器之间的身份。
在阅读了类似的SO问题后,我发现建议使用挑战-响应机制。有人能给出任何好的编码示例吗?
此外,如果我们可以在服务器上安全生成私钥-公钥对并将公钥分配给所有客户端,那么是否可以使用公钥加密来传递客户端和服务器之间的信息,而不是使用挑战-响应机制。
编辑:通过客户端,我指的是实际使用客户端机器进行登录的用户。

你所说的客户端是指用户使用的客户端还是客户端应用程序本身?另外,你们都是在Windows环境下吗?也就是说,客户端和服务都在同一个AD域中,并且你们是使用net.tcp还是http传输协议? - softveda
@user428468:你已经有了身份验证方案,对吧?现在你是在寻找一种在身份验证期间保护通信的方法? - Paul Sasik
@Pratik:他们没有进行任何类型的Windows凭据验证:“用户密码的哈希值存储在数据库中,用于验证用户身份。” - Paul Sasik
是的,认证方案已经就位(密码哈希和随机盐),但我们需要保护客户端和服务器之间的通信安全。此外,我们正在使用 net.tcp 进行传输。 - EndlessSpace
3个回答

2

使用SSL加密您的客户端和服务器之间的通信,您的公钥(也称为非对称加密)将被处理。您不需要自己编写代码 只需配置使用SSL


SSL并未提供客户端身份验证机制,这是要求的。虽然可以使用客户端证书实现,但如果用户众多,特别是WCF服务托管在Windows服务中而非IIS中,则不建议这样做,因为设置客户端证书并不是一件容易的事情。 - softveda
@Pratik:没错,SSL 只保护通信安全。我认为 OP 的问题是在问如何保护他们现有的身份验证方法。以下陈述证明他们已经在进行自定义身份验证:'用户密码的哈希值存储在数据库中以验证用户身份',他们可能只是想要保护它。 - Paul Sasik

0

整个过程如下:

服务器生成一个挑战并发送给客户端,例如 X。

在客户端:

passwordHashed = Hash(password) challengeHashClient = Encrypt(X, passwordHashed) //passwordHashed 是密钥

将 challengeHashClient 发送到服务器。

在服务器端:

从数据库中获取 passwordhashed challengeHashServer = Encrypt(X, passwordhashed)

将 challengeHashServer 与 challengeHashClient 进行匹配。

此操作必须有超时机制以防止重放攻击。

但是,如果您正在使用 Windows 环境,为什么不考虑使用 Windows Kerberos 认证呢?


0

如果您的客户端和服务器在同一个AD域上,最简单的选项是使用具有AD身份验证的net.tcp传输。用户的Kerberos令牌将被呈现给服务,并可以使用AD角色进行身份验证。
如果您无法使用集成的AD身份验证并且必须使用该方案,则可以使用自定义用户名validator


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接