【问题标题】:Saving account balance data securely安全保存账户余额数据
【发布时间】:2015-06-24 20:14:41
【问题描述】:

我正在开发一个应用程序,该应用程序目前只能在客户端上运行,而没有数据保存在服务器上。我希望改变这种情况,但我开始意识到需要保存的数据非常敏感。就像银行账户余额一样。

有没有办法像这样安全地保存数据?我的意思是数字数据。我还需要使用这些数据来计算其他一些东西。

这种情况的正常方法是什么?

【问题讨论】:

    标签: database security encryption hash


    【解决方案1】:

    存储此类数据的最佳方式是在将其上传到服务器之前使用用户密码对其进行加密。这样,您的服务器就无法访问数据,只能将其发送回客户端进行解密。这意味着服务器上不能进行任何计算;它们都需要在客户端发生。

    任何允许您的服务器直接访问数据的方案都意味着有权访问服务器的任何人(无论是因为他们被授权,还是因为他们已经闯入)都可以访问数据。避免这种情况的最佳方法是避免直接访问数据。

    鉴于存储少量数字的目标,我可能会采用一种方法来平衡复杂性和性能以及良好的安全性。

    • 为您的应用创建一个“全局前缀”(例如“net.robnapier.thisparticularapp”)。
    • 为每个用户生成前缀 + 用户名的“盐”
    • 使用 PBKDF2 从 salt 和用户密码生成主密钥。
    • 为您要加密的每个字段命名。
    • 要获取每个字段的加密密钥,请应用 HMAC(master, keyname) 以生成新的 256 位密钥。
    • 使用该密钥通过 AES-256-CBC 加密字段:
      • 选择一个随机的 8 字节 IV(初始化向量)
      • 使用 AES(字段密钥、IV、数据)加密
      • 存储为IV+加密(所以一共16个字节来存储8个字节的数据)

    要解密,您使用 PBKDF2 重新创建密钥,从字段开头读取 IV,然后解密其余部分。

    有比 CBC 更好的加密模式,但它无处不在,并且对于这个应用程序来说可能已经足够好了。 CBC 的缺点是,如果有人修改了数据库中的数据,可能很难检测到,并且用户可能会得到错误的结果。有几种方法可以解决这个问题,但这种情况听起来不像数据完整性是主要问题。 (如果是,请查看 HMAC+CBC 或“经过身份验证的分组密码模式”而不是 CBC。)

    【讨论】:

    • 这似乎是个好主意。你曾经使用过这种方法吗?这个应用程序实际上是我的一个小实验,但我当然想使用良好的安全实践。
    • 是的,我已经构建了这样的系统(特别是旨在提供端到端加密同时允许中间存储的消息传递系统)。一个好的设计可能需要一些仔细的思考和对密码学如何工作的合理理解。我将更新一些实用指南以存储少量数字。
    • 请做。我对密码学没有任何经验,可以提供一些指导。具体来说,这些情况应该使用什么加密。
    【解决方案2】:

    使用对称密钥加密(使用 AES)加密数据并将密文保存到磁盘。如果服务器受到威胁并且数据被盗,这会有所帮助。但是,数据以明文形式提供给服务器端应用程序,因此有权访问服务器的任何人(绝对是在服务器上具有管理员权限的任何人)都可能看到数据。因此,服务器的物理安全也至关重要。

    【讨论】:

      【解决方案3】:

      哎呀...这很棘手,您必须以 AES-256 加密之类的方式加密这些数据。当然,这将包括所有可能对用户构成潜在安全风险的数据字段,例如:密码、电子邮件、姓名等。

      要输入此数据,您必须确保使用会话安全登录进行 SSL 传输,以防止 cookie 复制。这只是我能想到的。

      购买一些经过验证的第三方软件会更好。

      【讨论】:

        猜你喜欢
        • 2011-07-11
        • 1970-01-01
        • 2016-09-23
        • 2011-05-21
        • 1970-01-01
        • 2011-12-09
        • 2012-04-07
        • 2022-07-26
        • 2014-08-27
        相关资源
        最近更新 更多