代码之家  ›  专栏  ›  技术社区  ›  Philip Daubmeier

用于上载数据的webservice:安全考虑

  •  3
  • Philip Daubmeier  · 技术社区  · 15 年前

    我不确定我应该为我的webservice使用什么身份验证方法。我搜了这么久,没发现什么对我有帮助的。

    初步

    im正在构建一个应用程序,该应用程序将数据从本地数据库上载到服务器(运行我的webservice),在服务器上合并所有记录并存储在中央数据库中。我正在对 DataTable ,其中包含本地数据库的一小部分,其中所有无趣的内容都已被过滤掉。这个 byte[] (序列化数据表),连同用户id和用户密码的散列,然后通过soap上传到webservice。应用程序和webservice已经完全按照预期工作了。

    问题

    我现在想的问题是:如果有人只是嗅探网络流量,“窃取”用户id和密码散列,用修改过的数据发送自己的soap消息,从而破坏我的数据库,那会怎么样?

    小更新: 不要误解:我不担心语法/验证问题。当然,所有到达webservice的数据都是经过验证的,我对其进行了深入的单元测试。我是说攻击者可以 语义上 损坏数据库:例如,用户只能编辑其提交的记录。攻击者可以利用这个事实,伪装成某个用户并编辑他上传的数据。

    我只是不希望有一些技术知识的人可以直接用另一个用户的名字来转储带有垃圾的数据库。

    选项

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

    • 使用SSL+证书建立连接:
      • 我真的不想使用ssl,我更喜欢一个更简单的解决方案。毕竟,传输到webservice的所有信息稍后都可以在网站上看到。我想说的是:没有秘密/财务/业务关键信息,必须隐藏。我认为ssl对这项任务来说有点过头了。
    • 加密 字节[] :
      • 我认为这将是一个性能杀手,考虑到练习的目标只是验证用户。
    • 散列用户密码和数据:
      • 我有点喜欢这样的想法:从数据中创建一个校验和,将该校验和密码散列连接起来,然后再次散列整个过程。这将确保数据是从这个特定用户发送的,并且数据不会被修改。

    实际问题

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

    • 相当简单的解决方案(因为它不需要超级安全;不传输机密/业务关键信息)
    • 容易实现的回顾(不想再写一遍:)
    • 对性能影响不大

    你觉得我更喜欢的解决方案,上面列表中的最后一个怎么样?

    有没有其他的解决方案我没有提到,那会更适合?

    我什么都不担心吗?在每次soap消息中发送用户id和密码散列就足够了吗?

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

    提前谢谢!

    1 回复  |  直到 12 年前
        1
  •  2
  •   bluish dmajkic    12 年前

    你真的 必须 使用HTTPS。到目前为止,ssl是您可以实现的最简单的安全系统,每年只需30美元。不要重新发明轮子!你的时间到底值多少钱?你不能只调用“加密函数”。要正确实现该协议,您必须考虑分组密码模式、初始化向量、String2Key(S2K)函数,最后还要考虑验证服务器和/或客户端的方法(非对称cyrpto/pki…)。简而言之,绝大多数程序员完全不知道创建一个真正安全的协议需要做什么。

    更进一步 绝对不可能 创建不带ssl的安全会话和身份验证。这是来自OWASP前10名 A3:Broken Authentication and Session Management .

    散列用户密码和数据

    你在这里描述的是 Hash Message Authentication Code 或者是HMAC。如果您只是以明文形式将用户名和密码发送到行上,那么这样做毫无意义。hmac的关键在于您使用的是一个秘密,除非您使用ssl,否则密码不是秘密。

    如果你通过网络发送密码散列来进行身份验证,那么你真的搞砸了。散列密码的整个目的是在攻击者使用SQL注入从数据库中获取另一个用户密码散列之后减缓其速度,如果您使用消息摘要进行身份验证,则攻击者无需破坏散列。就好像你在用明文存储密码一样。