开源程序中的加密?

Encryption in an open-source program?

目前我正在开发一个 Node.js 网络服务器应用程序,然后我想将其提供给下载和使用。此应用程序应具有帐户功能,以便您可以在服务器创建的网站上使用您的帐户登录。
因为那需要密码,所以我显然还必须考虑安全性。但是现在,我真的不知道我应该如何在发送和接收密码时保护密码。

对于存储,我打算简单地创建密码的哈希并将该哈希存储在某个地方,但是传输呢?

我在考虑 SSL/https,但这需要 SSL 证书,即使我在某个地方免费获得它,我也无法在开源应用程序中共享它(?)。

我也可以以某种方式对网站中的密码进行哈希处理,然后将哈希发送到服务器,但我认为这也不是最高的安全标准,对吗?考虑到没有 SSL 会导致比 worse/none 加密更多的缺点。

有什么想法吗?

I was thinking about SSL/https, but this would require a SSL certificate, and even if I got it for free somewhere, I couldn't share it in an open-source app(?).

使用SSL/TLS。即使它是一个开源应用程序,也不意味着您也需要共享您的私钥。这会破坏整个概念。

开放源代码意味着您使用某些许可证共享代码。许可人用它做什么不是你的同意,只要他们符合许可。如果他们想在他们自己的域下使用他们自己的软件实例,他们必须创建他们自己的证书(在他们的域下)。

I could also somehow hash the password in the website, and then just send the hash to the server, but I think this wouldn't be the highest standard of security as well, would it? Considering that no SSL would cause more disadvantages than just worse/none encryption.

这不是解决方案,因为您现在将要保护的东西更改为其他东西。该模型不会因为您在客户端对其进行哈希处理而改变。现在您需要保护传输通道上的散列,这实际上与您之前发送密码时遇到的问题相同。

Currently I'm developing a Node.js webserver-app that I then want to make available for download and use. This app should feature accounts, so that you can log in with your account on the website created by the server.

联合账户

如果您希望跨多个由不同方托管的应用程序实例联合帐户。

您可以将 OpenID 视为应用程序所有实例的身份提供者。然后,您可能会要求用户使用已知的 OpenID 提供商,或者您设置自己的默认提供商。您可以将您的提供商的代码作为开源代码发布,但应用程序运行不需要它。

如果 OpenID 接口不够用,总有办法在您的应用实例之间建立配对。您必须构建一个接口,让不同的实例可以共享数据。

未连接实例

如果这仅仅是为了保证通信安全而没有SSL/TLS,那么我必须说,这在一般意义上是不可能的。

然而,您可以让每个学生亲自注册并在客户端和服务器上使用该密码来派生共享密钥(即用于 AES)。然后你可以使用 CryptoJS 使用 AES 加密所有内容并使用 AJAX 发送它。问题当然是 (1) 必须有人处理注册,以及 (2) 这很容易受到中间人攻击,因为 JavaScript crypto is bad.

好消息是 Let’s Encrypt 即将上线。它将启用一种半自动方式来为您的域请求免费证书。这将非常简单,您可以将其作为正常 NPM 安装工作流程的一部分来执行。

http://letsencrypt.org 非常适合这个,现在可以使用(我知道我来晚了一点。)

您可以查看 https://github.com/DylanPiercey/auto-sni 以获得自动 Letsencrypt 证书。