安全地保存账户余额数据
Saving account balance data securely
我正在开发一个应用程序,该应用程序目前只能在客户端上运行,服务器上没有保存任何数据。我希望改变这种情况,但我已经意识到需要保存的数据非常敏感。与银行账户余额一样。
有没有办法像这样安全地保存数据?我的意思是数字数据。我还需要使用这些数据来计算其他一些东西。
正常的做法是什么?
使用对称密钥密码术(使用AES)加密数据并将密文保存到磁盘。如果服务器受到威胁并且数据被盗,这会有所帮助。但是,数据以明文形式提供给服务器端应用程序,因此任何有权访问服务器的人(绝对是任何在服务器上具有管理员权限的人)都可能看到这些数据。所以服务器的物理安全性也是最重要的。
哎哟...这很棘手,您将不得不使用类似 AES-256 加密的方式来加密此数据。这当然将包括所有可能证明对用户存在潜在安全风险的数据字段,例如:密码、电子邮件、姓名等。
要输入此数据,您必须确保使用会话安全登录进行 SSL 传输,以防止 cookie 的复制。这就是我能想到的。
你最好获得某种经过验证的第三方软件。
存储此类数据的最佳方法是在将其上传到服务器之前使用用户密码对其进行加密。这样,您的服务器无法访问数据,只能将其发送回客户端进行解密。这意味着服务器上不能进行任何计算;它们都需要在客户端上发生。
任何允许您的服务器直接访问数据的方案都意味着任何有权访问服务器的人(无论是因为他们获得授权,还是因为他们已经闯入)都可以访问数据。避免这种情况的最佳方法是避免直接访问数据。
考虑到存储少量数字的目标,这里是我可能会攻击它的一种方法,以平衡复杂性和性能与良好的安全性。
- 为您的应用制作 "global prefix"(如 "net.robnapier.thisparticularapp")。
- 为每个用户生成 "salt" 前缀 + 用户名
- 使用 PBKDF2 从盐和用户密码生成主密钥。
- 为每个要加密的字段命名。
- 要获取每个字段的加密密钥,应用 HMAC(master, keyname) 生成一个新的 256 位密钥。
- 使用该密钥通过 AES-256-CBC 加密字段:
- 选择一个随机的 8 字节 IV(初始化向量)
- 使用 AES 加密(字段密钥、IV、数据)
- Store as IV+Encrypted(所以一共16个字节来存储8个字节的数据)
要解密,您使用 PBKDF2 重新创建密钥,读取字段开头的 IV,然后解密其余部分。
有比 CBC 更好的加密模式,但它无处不在,并且可能足以满足此应用程序的需求。 CBC 的缺点是,如果有人修改了您在数据库中的数据,可能很难检测到,并且用户可能会得到不好的结果。有几种方法可以解决这个问题,但这种情况听起来数据完整性并不是主要问题。 (如果是,请查看 HMAC+CBC 或 "authenticated block-cipher mode" 而不是 CBC。)
我正在开发一个应用程序,该应用程序目前只能在客户端上运行,服务器上没有保存任何数据。我希望改变这种情况,但我已经意识到需要保存的数据非常敏感。与银行账户余额一样。
有没有办法像这样安全地保存数据?我的意思是数字数据。我还需要使用这些数据来计算其他一些东西。
正常的做法是什么?
使用对称密钥密码术(使用AES)加密数据并将密文保存到磁盘。如果服务器受到威胁并且数据被盗,这会有所帮助。但是,数据以明文形式提供给服务器端应用程序,因此任何有权访问服务器的人(绝对是任何在服务器上具有管理员权限的人)都可能看到这些数据。所以服务器的物理安全性也是最重要的。
哎哟...这很棘手,您将不得不使用类似 AES-256 加密的方式来加密此数据。这当然将包括所有可能证明对用户存在潜在安全风险的数据字段,例如:密码、电子邮件、姓名等。
要输入此数据,您必须确保使用会话安全登录进行 SSL 传输,以防止 cookie 的复制。这就是我能想到的。
你最好获得某种经过验证的第三方软件。
存储此类数据的最佳方法是在将其上传到服务器之前使用用户密码对其进行加密。这样,您的服务器无法访问数据,只能将其发送回客户端进行解密。这意味着服务器上不能进行任何计算;它们都需要在客户端上发生。
任何允许您的服务器直接访问数据的方案都意味着任何有权访问服务器的人(无论是因为他们获得授权,还是因为他们已经闯入)都可以访问数据。避免这种情况的最佳方法是避免直接访问数据。
考虑到存储少量数字的目标,这里是我可能会攻击它的一种方法,以平衡复杂性和性能与良好的安全性。
- 为您的应用制作 "global prefix"(如 "net.robnapier.thisparticularapp")。
- 为每个用户生成 "salt" 前缀 + 用户名
- 使用 PBKDF2 从盐和用户密码生成主密钥。
- 为每个要加密的字段命名。
- 要获取每个字段的加密密钥,应用 HMAC(master, keyname) 生成一个新的 256 位密钥。
- 使用该密钥通过 AES-256-CBC 加密字段:
- 选择一个随机的 8 字节 IV(初始化向量)
- 使用 AES 加密(字段密钥、IV、数据)
- Store as IV+Encrypted(所以一共16个字节来存储8个字节的数据)
要解密,您使用 PBKDF2 重新创建密钥,读取字段开头的 IV,然后解密其余部分。
有比 CBC 更好的加密模式,但它无处不在,并且可能足以满足此应用程序的需求。 CBC 的缺点是,如果有人修改了您在数据库中的数据,可能很难检测到,并且用户可能会得到不好的结果。有几种方法可以解决这个问题,但这种情况听起来数据完整性并不是主要问题。 (如果是,请查看 HMAC+CBC 或 "authenticated block-cipher mode" 而不是 CBC。)