如何使用 Electron 存储私钥或安全信息/数据
How to store private key or secure information / data with Electron
我正在使用电子为跨平台开发独立应用程序。
I want store private data like private key, private data for some
execution in app. Execution like encrypt / decrypt data.
或
I want store some secured information like user password, proprietary
data on app
是否有任何可能的方式来存储此类安全信息并且应用程序用户无法以任何方式获取?
我不知道你使用的具体技术,所以我的回答一般会指向密钥存储问题。
首先声明两句:
- 即使使用一些重型专用硬件(银行和其他关键系统为此使用硬件安全模块 -HSM-),也始终存在密钥被盗的风险。您选择做什么取决于您的密钥有多重要以及您愿意为保护它付出多少。我会尽量避免提及涉及硬件的解决方案,因为它们对大多数人来说通常是矫枉过正。
- 但是,您可以遵循一些好的做法:https://www.owasp.org/index.php/Cryptographic_Storage_Cheat_Sheet
现在,一些建议。无论您做什么,都不要以明文形式存储您的密钥(更不用说硬编码了)。如果您使用 public 密钥加密,PKCS12 文件(通常扩展名为 .p12 或 .pfx)是存储数据的标准方式。它们通常受密码保护。
在这里你面临一个问题:如果你有钥匙,你需要使用它。如果您使用密钥,它将在 "plaintext" 中,至少在 RAM 中。因此,您需要一种方法来启用尽可能隔离密钥的访问。如果操作是由用户触发的,则情况相对较好,因为您可以在使用密钥之前询问密码。
但是,如果操作是自动化的,您需要找到一种方法来存储密码。即使像一些 PGP 实现这样的安全软件也有一些不好的方法:
- 在命令行中询问密码:command -password my-password。这个,放在蝙蝠身上,有效。但是密码会被存储,并且根据操作系统的不同,甚至可以使用命令
history
.
- 将它存储在一个文件中:至少你不会留下副本,但密码仍然是明文。
- 使用系统数据作为加密密钥对其进行加密:密码相对受到保护,但您失去了便携性,并且可以访问计算机的攻击者不会被控件阻止。
- 一旦服务开启就询问密码:更合理一些,但并非总是可行(如果服务很重要但只有一个人知道密码,可用性可能会受到影响)。
- 花哨的事情可以用阈值解密来完成,但对于那种情况来说这可能也太多了。
我没有提供每个选项的详细信息,因为您可以做什么可能取决于您的框架允许的内容以及您系统的使用方式,但我希望它能作为不同选项的参考有所帮助。在任何情况下,不要自行实现任何加密功能。糟糕的加密比没有加密更糟糕。
有一个为 Atom 编辑器(Electron 的应用程序)制作的 NPM 模块,称为 Keytar。它使用本机 OS API 进行安全存储。例如。 OS X.
上的钥匙串
避免在 Electron 应用程序中存储私有或服务器端详细信息,例如私钥。 Electron 应用程序的数据和文件可以从 app.asar
文件访问,Electron 根本不保护内容。 electron中没有这种代码保护机制。不过NW.js
支持源码保护,大家可以看看here。所以根据我的说法,在电子源代码中存储私人认证(如签署证书或私钥)是不安全的。
作为另一种方式,您可以使用 node-keytar 将这些数据存储在 mac 的钥匙串中,windows 中的凭据管理器和 Linux 中的 Gnom Keyring 使用本机api。但是,这些凭据仍然可供用户访问,并且对于存储私有令牌(即具有管理权限的 GitHub 私有存储库的令牌)没有意义。这取决于用户,如果 he/she 足够复杂以了解您在 Keychain、Credential Manager 或 Keyring 中存储了什么,他们可能会滥用它或对您不利。所以最后的答案是,
不要在电子源或使用 node-keytar 中存储 Credentials/Private 密钥或管理令牌。
在电子中存储数据的完美方式是这个包:https://www.npmjs.com/package/electron-data-holder
此软件包将数据存储在 JSON 文件中,但它使您能够加密数据。
在文档中阅读更多内容
我正在使用电子为跨平台开发独立应用程序。
I want store private data like private key, private data for some execution in app. Execution like encrypt / decrypt data.
或
I want store some secured information like user password, proprietary data on app
是否有任何可能的方式来存储此类安全信息并且应用程序用户无法以任何方式获取?
我不知道你使用的具体技术,所以我的回答一般会指向密钥存储问题。
首先声明两句:
- 即使使用一些重型专用硬件(银行和其他关键系统为此使用硬件安全模块 -HSM-),也始终存在密钥被盗的风险。您选择做什么取决于您的密钥有多重要以及您愿意为保护它付出多少。我会尽量避免提及涉及硬件的解决方案,因为它们对大多数人来说通常是矫枉过正。
- 但是,您可以遵循一些好的做法:https://www.owasp.org/index.php/Cryptographic_Storage_Cheat_Sheet
现在,一些建议。无论您做什么,都不要以明文形式存储您的密钥(更不用说硬编码了)。如果您使用 public 密钥加密,PKCS12 文件(通常扩展名为 .p12 或 .pfx)是存储数据的标准方式。它们通常受密码保护。
在这里你面临一个问题:如果你有钥匙,你需要使用它。如果您使用密钥,它将在 "plaintext" 中,至少在 RAM 中。因此,您需要一种方法来启用尽可能隔离密钥的访问。如果操作是由用户触发的,则情况相对较好,因为您可以在使用密钥之前询问密码。
但是,如果操作是自动化的,您需要找到一种方法来存储密码。即使像一些 PGP 实现这样的安全软件也有一些不好的方法:
- 在命令行中询问密码:command -password my-password。这个,放在蝙蝠身上,有效。但是密码会被存储,并且根据操作系统的不同,甚至可以使用命令
history
. - 将它存储在一个文件中:至少你不会留下副本,但密码仍然是明文。
- 使用系统数据作为加密密钥对其进行加密:密码相对受到保护,但您失去了便携性,并且可以访问计算机的攻击者不会被控件阻止。
- 一旦服务开启就询问密码:更合理一些,但并非总是可行(如果服务很重要但只有一个人知道密码,可用性可能会受到影响)。
- 花哨的事情可以用阈值解密来完成,但对于那种情况来说这可能也太多了。
我没有提供每个选项的详细信息,因为您可以做什么可能取决于您的框架允许的内容以及您系统的使用方式,但我希望它能作为不同选项的参考有所帮助。在任何情况下,不要自行实现任何加密功能。糟糕的加密比没有加密更糟糕。
有一个为 Atom 编辑器(Electron 的应用程序)制作的 NPM 模块,称为 Keytar。它使用本机 OS API 进行安全存储。例如。 OS X.
上的钥匙串避免在 Electron 应用程序中存储私有或服务器端详细信息,例如私钥。 Electron 应用程序的数据和文件可以从 app.asar
文件访问,Electron 根本不保护内容。 electron中没有这种代码保护机制。不过NW.js
支持源码保护,大家可以看看here。所以根据我的说法,在电子源代码中存储私人认证(如签署证书或私钥)是不安全的。
作为另一种方式,您可以使用 node-keytar 将这些数据存储在 mac 的钥匙串中,windows 中的凭据管理器和 Linux 中的 Gnom Keyring 使用本机api。但是,这些凭据仍然可供用户访问,并且对于存储私有令牌(即具有管理权限的 GitHub 私有存储库的令牌)没有意义。这取决于用户,如果 he/she 足够复杂以了解您在 Keychain、Credential Manager 或 Keyring 中存储了什么,他们可能会滥用它或对您不利。所以最后的答案是,
不要在电子源或使用 node-keytar 中存储 Credentials/Private 密钥或管理令牌。
在电子中存储数据的完美方式是这个包:https://www.npmjs.com/package/electron-data-holder
此软件包将数据存储在 JSON 文件中,但它使您能够加密数据。
在文档中阅读更多内容