如何使用 Electron 存储私钥或安全信息/数据
Posted
技术标签:
【中文标题】如何使用 Electron 存储私钥或安全信息/数据【英文标题】:How to store private key or secure information / data with Electron 【发布时间】:2016-07-13 08:10:29 【问题描述】:我正在使用电子开发跨平台的独立应用程序。
我想存储私有数据,例如私钥,某些人的私有数据 在应用程序中执行。像加密/解密数据这样的执行。
或者
我想存储一些安全信息,例如用户密码、专有信息 应用上的数据
是否有任何可能的方式来存储此类安全信息而应用程序用户无法获得任何方式?
【问题讨论】:
【参考方案1】:有一个为 Atom 编辑器(Electron 应用程序)制作的 NPM 模块,名为 Keytar。它使用本机操作系统 API 进行安全存储。例如。 OS X 上的钥匙串。
https://github.com/atom/node-keytar
【讨论】:
keytar 可能不是一个好的解决方案。数据可能被加密,但可由任何其他用户进程访问:github.com/atom/node-keytar/issues/88【参考方案2】:我不知道您使用的具体技术,所以我的回答将笼统地指向密钥存储问题。
首先要说两句:
-
即使使用一些重型专用硬件(银行和其他关键系统为此使用硬件安全模块 -HSM-),您的密钥也始终存在被盗的风险。你选择做什么取决于你的密钥有多重要,以及你愿意做多少来保护它。我会尽量避免提及涉及硬件的解决方案,因为它们通常对大多数人来说太过分了。
不过,您可以遵循一些好的做法:https://www.owasp.org/index.php/Cryptographic_Storage_Cheat_Sheet
现在,一些建议。无论您做什么,都不要以纯文本形式存储您的密钥(更不用说硬编码)。如果您使用公钥加密,PKCS12 文件(通常扩展名为 .p12 或 .pfx)是存储数据的标准方式。它们通常受密码保护。
这里你面临一个问题:如果你有钥匙,你就需要使用它。如果您使用密钥,它将是“明文”,至少在 RAM 中。因此,您需要一种方法来启用使密钥尽可能隔离的访问。如果操作是由用户触发的,事情就比较好,因为您可以在使用密钥之前询问密码。
但是,如果操作是自动化的,您需要找到一种方法来存储密码。即使是像一些 PGP 实现这样的安全软件也有一些不好的方法:
-
在命令行中询问密码:command -password my-password。这个,放在一个蝙蝠,工作。但是密码会被存储,并且根据操作系统的不同,甚至可以通过命令
history
获得。
将其存储在文件中:至少您不会留下副本,但密码仍然是明文。
使用系统数据作为加密密钥对其进行加密:密码相对受到保护,但您会失去便携性,并且无法通过控件阻止可以访问计算机的攻击者。
在服务开启时要求输入密码:更合理一点,但并非总是可行(如果服务很重要但只有一个人拥有密码,则可用性可能会受到影响)。
可以通过阈值解密来完成一些奇特的事情,但对于这种情况来说,这也可能太过分了。
我没有提供每个选项的详细信息,因为您可以做什么可能取决于您的框架允许的内容以及系统的使用方式,但我希望它有助于作为不同选项的参考。在任何情况下,请勿自行实施任何加密功能。糟糕的加密比没有加密更糟糕。
【讨论】:
【参考方案3】:避免在电子应用程序中存储私人或服务器端详细信息,例如私钥。 Electron 应用程序的数据和文件可以从app.asar
文件访问,electron 根本不保护内容。在电子中没有这样的代码保护机制。不过NW.js
支持源代码保护,你可以阅读here。所以在我看来,在电子源代码中存储私人认证(如签署证书或私钥)是不安全的。
作为另一种方式,您可以使用node-keytar 将这些数据存储在 Mac 的钥匙串中,Windows 中的凭据管理器和 Linux 中使用本机 api 的 Gnom Keyring 中。但是,这些凭证仍然可供用户访问,并且对于存储私有令牌(即具有管理权限的 GitHub 私有存储库的令牌)没有意义。这取决于用户,如果他/她足够老练,可以了解您在 Keychain、Credential Manager 或 Keyring 中存储了什么,他们可能会滥用它或对您使用。所以最终的答案是,
不要将凭证/私钥或管理令牌存储在电子源中或使用 node-keytar。
【讨论】:
【参考方案4】:在电子中存储数据的完美方式是这个包:https://www.npmjs.com/package/electron-data-holder
此包将数据存储在 JSON 文件中,但它使您能够加密数据。
在文档中阅读更多内容
【讨论】:
以上是关于如何使用 Electron 存储私钥或安全信息/数据的主要内容,如果未能解决你的问题,请参考以下文章