node.js - 每个用户在哪里存储 SHA256 密钥对
问题描述
我在 NodeJS 中有一个数据库和一个 API,我使用 Web 应用程序创建用户,每个用户都可以创建/更新/删除数据。
为了保护这一点,我需要加密用户的数据。所以我想要的是在每次创建用户时创建一对 SHA256 公钥。
实际上,我所做的是将这些密钥存储在数据库中,通过使用全局 SHA256 密钥对对其进行加密。
因此,简而言之,我有一对全局密钥来加密每个用户的每对特定密钥。
事实是这似乎并不安全,因为最终每个用户都有自己的加密/解密方法存储在数据库中。
例如,我可以有 2 个表:
User table :
id_user | firstname | lastname | encrypted_data
-----------------------------------------------
1 | John | Doe | QMwmuCMmI..
2 | Jane | Doe | QMwmuCMmI..
...
Keys table :
id_user | public | private
------------------------------
1 | MIICIjA.. | MIIJrT..
2 | MIICIjA.. | MIIJrT..
...
所以链接John Doe
到他的公钥和私钥很简单。
一个问题是我不能要求用户创建一对私钥/公钥并只向我发送公共密钥,因为所有这些都需要是自动的,用户不必做任何事情。
另一个问题是应用程序应该可以在任何设备上使用,因此私钥不能存储在客户端。
解决方案
您不能将它们存储在服务器上,因为攻击者在服务器上。恶意黑客可以轻松找到密钥(因为它们未加密),下载整个数据库并解密所有内容。
因此,您最好的选择是将密钥存储在完全不同的机器上,并让该机器进行加密和解密。这样,攻击者首先必须闯入您的机器,然后再进入加密/解密机器。并非不可能,但希望更难。
基本上,没有什么是不可破解的。使攻击者尽可能困难的事情是要走的路。
此外,即使您必须将数据严格存储在主服务器可以访问的数据库中,也不要将它们存储在同一个表中(如示例中所示,您如何将它们保存在单独的表中)。保持添加到用户数据库的所有数据的索引相同,以便用户数据库的索引 1 将为该索引生成正确的键(正是您所做的)。
另一种选择是加密硬件。我对此并不熟悉,但我知道有些公司销售的硬件可以满足您的所有加密需求。
推荐阅读
- linq - LINQ选择分组后具有最大值的行
- asp.net-core - 有没有办法为同一个控制器使用两种身份验证方案?
- html - 检测布尔值是否更改Angular 8
- emacs - Emacs lisp,如何在 IELM 中换行?
- r - 从数据框中填充矩阵
- netcdf - 在单个命令中将两个 NetCDF 文件中的变量相乘
- python - 系统错误:
返回 NULL 而不设置错误 - python-3.x - 远程服务器上的 PyCharm 不显示未使用的导入、#fixme 等
- node.js - 在 nodejs 中每分钟调用 5 个 API
- gradle - 初始化数据库时的 Gradle 任务