没有证书和windows auth的WCF消息安全性如何实现?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

我有一个WCF服务和客户端,它将被部署到几家公司(数百个)。一些公司将在他们的网络中运行软件,一些公司将通过互联网运行它(WCF服务器在办公室,WCF客户端在另一个)。

我们想要加密WCF服务器和客户端之间的通信。我们不需要使用WCF安全认证cient /订户,因为我们有我们自己的用户名/密码登录,客户将用它登录服务器。

  • 我们不能依靠Windows验证,因为有些用户会通过Internet运行它,并且WCF服务器可能与WCF客户端不在同一个域中。
  • 如果我们使用“真实”证书*,运行该软件的公司必须从CA购买证书并安装它,然后配置我们的软件以使用它,但这对大多数人来说太复杂了。
  • 我们可以在安装WCF服务器的过程中自动创建证书,但是我们必须自动将其安装到证书存储区,并以某种方式自动授予IIS权限以读取证书。这比我们想要的更复杂。

简而言之,我们想要一个简单的解决方案,其中加密仅基于共享密钥,在我们的例子中是用户登录的用户名/密码。我明白,这不会提供最佳的可用加密,但我们愿意交易一些安全性以使软件更易于部署。

这可能吗?

*对于“真实”证书,我是指从证书颁发机构购买的证书,而不是我自己创建/自签名的证书。

提问于
用户回答回答于

那么,在WCF中,可以在消息级别使用密码凭据,在传输级别使用SSL,我认为你的情况就足够了。

看到这里

用户回答回答于

如果你想加密传输上的消息(这真是个好主意!),发送者(客户端)和服务器之间必须有一些共享的知识。这可以是硬编码的,但根本不是一个好主意 - 如果这种“共同共享”的知识受到破坏,攻击者就可以破译并阅读你的所有消息。

另外,由于绝对推荐这种做法,因此WCF不支持任何类型的简化共享机密。你是你自己的 - 你必须自己完成自己的100%。

以安全的方式交换共同秘密的唯一可行方法是使用证书。没有办法解决这个问题,抱歉。证书甚至不必用于用户认证或任何其他用途 - 但它在调用者和服务之间建立共享密钥,并因此允许调用者以这种方式加密消息,只有预期的接收者可以实际解密并使用他们。

所以我真的不认为你可以在服务器上获得证书 - 不需要在每个客户端上,而是在服务运行的每台服务器上。

渣子

PS:如果你真的想调查“硬编码共享秘密”的方法,你需要考虑这一点:

  • 你如何在每一个客户端安全地存储共享密钥?
  • 你如何使用存储的共享密钥中的信息来加密你的消息?

通常情况下,这种方法有两个方面:

  1. 交换某种形式的私人/公共密钥对; 服务器会生成一个密钥对并将私钥保存到自身并与客户端共享公钥(例如,通过WCF消息)
  2. 使用该私钥/公钥对交换共同的共享秘密,例如对称地加密您的消息的“加密密钥”(并且由于它是对称的,服务器可以使用相同的密钥来解密消息)
  3. 在您的客户端设置基础设施(例如称为行为的WCF扩展),在消息出来之前检查消息并使用共享密钥对消息进行加密

总而言之,这不是微不足道的 - 比这更简单的东西根本不值得被称为“安全”。

如果你看看所有这些工作,你将不得不这样做 - 使用WCF内置证书机制不是更容易吗?

体面安全称职很难-那么,为什么不充分利用什么可用的,而不是自己做所有的工作,或者更糟:想出一个半生不熟的解决方案,是很容易破解,你可以很容易地以明文发送的一切...... ..不要低估即使是最基本的安全方案所需的代码的复杂性和数量 - WCF完成这些工作 - 免费并且以可靠和安全的方式 。

扫码关注云+社区