c# - 用于上传数据的Web服务 : security considerations

标签 c# .net security authentication web-services

我不确定应该为我的网络服务使用哪种身份验证方法。我在 SO 上搜索过,但没有找到对我有帮助的东西。

初步

我正在构建一个将数据从本地数据库上传到服务器(运行我的网络服务)的应用程序,其中所有记录都合并并存储在中央数据库中。我目前正在二进制序列化一个 DataTable,它包含本地数据库的一小部分,其中所有无趣的内容都已被过滤掉。 byte[](序列化数据表)连同用户 ID 和用户密码的哈希值随后通过 SOAP 上传到网络服务。该应用程序与网络服务已经完全按照预期工作。

问题

我现在考虑的问题是:如果有人只是嗅探网络流量,“窃取”用户 ID 和密码散列以发送他自己的 SOAP 消息以及破坏我的数据库的修改数据会怎样?

小更新: 不要被误解:我不担心句法/验证问题。到达网络服务的所有数据当然都经过验证,我对其进行了密集的单元测试。我的意思是“攻击者可以在语义上破坏数据库”:例如用户只能编辑他提交的记录。攻击者可以利用这一事实,将自己伪装成某个用户并编辑他上传的数据。

我只是不希望有一些技术了解的人可以将垃圾数据库转储到另一个用户名中。

选项

解决这个问题的方法,我已经想到了,是:

  • 使用 ssl + 证书建立连接:
    • 我真的不想使用 ssl,我更喜欢更简单的解决方案。毕竟,传输到网络服务的每条信息稍后都可以在网站上看到。我想说的是:没有必须隐藏的 secret /财务/业务关键信息。我认为 ssl 对于这项任务有点矫枉过正。
  • 加密 byte[]:
    • 考虑到该练习的目标只是对用户进行身份验证,我认为这会成为性能 killer 。
  • 将用户密码与数据一起散列:
    • 我有点喜欢这个想法:从数据创建校验和,将校验和与密码哈希连接起来,然后再次对整个事情进行哈希处理。这将确保数据是从该特定用户发送的,并且数据未被修改。

实际问题

那么,您认为满足以下要求的最佳方法是什么?

  • 相当简单的解决方案(因为它不必 super 安全;不会传输 secret /关键业务信息)
  • 易于追溯实现(不想再写一遍 :) )
  • 对性能影响不大

您认为我的首选解决方案(上面列表中的最后一个)怎么样?

有没有我没有提到的更适合的替代解决方案?

我什么都不担心吗?仅在每条 SOAP 消息中发送用户 ID 和密码散列就足够了吗?

您不必详细回答每个问题。把我推向正确的方向。我非常感谢每一个有充分根据的意见。

提前致谢!

最佳答案

您绝对必须使用 HTTPS。 SSL 是迄今为止您可以实现的最简单的安全系统,每年只需 30 美元。不要重新发明轮子!毕竟你的时间真的值多少钱?您不能只调用“加密功能”。要正确实现此协议(protocol),您必须担心 block 密码模式、初始化向量、string2key (s2k) 函数,以及最后一种验证服务器和/或客户端的方法(非对称 cyrpto/PKI...)。简而言之,绝大多数程序员完全不知道如何创建真正安全的协议(protocol)。

此外,在没有 SSL 的情况下绝对不可能创建安全 session 和身份验证。这是来自 OWASP 前 10 名 A3:Broken Authentication and Session Management .

Hashing the users password together with the data

您在这里描述的是 Hash Message Authentication Code或 HMAC。如果您只是通过线路以明文形式发送用户名和密码,那么这样做是没有意义的。 hmac 的全部意义在于您使用的是 secret ,除非您使用 SSL,否则密码不是 secret 。

如果您通过网络发送密码散列以进行身份​​验证,那么您就真的搞砸了。对密码进行哈希处理的全部目的是在攻击者使用 sql 注入(inject)从数据库中获取另一个用户密码哈希后减慢攻击者的速度,如果您使用消息摘要进行身份验证,那么攻击者将不必破坏哈希。这就好像您正在以明文形式存储密码。

关于c# - 用于上传数据的Web服务 : security considerations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2755116/

相关文章:

c# - WCF 中的调用是同步的吗?

email - DKIM 是否也对附件进行签名,还是仅对 header 字段和正文进行签名?

c# - 处理来自标准输出的 jpgs 流

security - 处理用户帐户身份验证和密码的最佳方式

security - JSF 2.0 如何防止 CSRF

c# - 如何只显示一个结果表,即从对象数组列表绑定(bind)到数据网格的结果?

c# - LINQ to SQL - 插入产生奇怪的行为

c# - 如何使用 Linq 在列表中查找两个连续项目的子列表

c# - 将对象列表转换为表格结构

.NET ORM 需要虚拟,不能处理密封?