【问题标题】:Client-side encryption in NodeJS/JavascriptNodeJS/Javascript 中的客户端加密
【发布时间】:2021-02-05 17:19:02
【问题描述】:

我正在做一个项目,我将从用户那里收到一些个人信息(最重要的是电话号码)。我一直在研究客户端加密和服务器端加密,但无法决定哪个更合适。

目前,数据库表包括两列:第 1 列存储加密的电话号码(使用非对称 RSA 加密),第 2 列存储最后四位数字的哈希值。

我尝试这样做的原因是:1)我正在尝试创建一个管理页面,我可以在其中查看电话号码(因此我不能只散列电话号码)和 2)用户将使用他们电话号码的最后四位数字进行验证(因此,将最后四位数字与加密的完整电话号码进行比较会非常复杂)。

这是我用来实现非对称 RSA 加密的代码。根据我的理解,这种加密被认为是服务器端加密。如果我想使用客户端加密,我应该如何实现它?请帮忙!

【问题讨论】:

  • 使用 HTTPS。您自己编写的任何加密方案都容易出现未知错误。另一方面,Chrome、Edge 和 Safari 使用的 HTTPS 库每天被数十亿人使用,并且众所周知,目前没有重大错误。发现的任何错误都将被视为科技界的重大新闻,并导致谷歌/苹果/微软等公司迅速发布补丁。

标签: javascript node.js encryption server-side client-side


【解决方案1】:

假设您使用 https 将数据从客户端传输到服务器(这是任何级别的安全性所必需的),因此无论如何您都将传输整个电话号码(因为您想将电话号码存储在一种可检索的方式),对任何东西进行客户端加密或散列都没有真正意义。只需在https的保护下将电话号码从客户端发送到服务器。而且,如果您找到存储最后四位数字哈希的特别好的理由,您可以在存储到数据库之前根据整个电话号码在服务器上计算该哈希。

而且,如果您不使用 https,那么请不要尝试重新发明自己的公钥/私钥加密来尝试在仍然使用 http 的同时获得 https 的一些好处。只需使用 https 并站在 30 多年发展的肩膀上,以及它提供的所有其他好处。

任何客户端对称加密都需要客户端上存在密钥,这是一个巨大的安全风险,因为任何客户端突然可以访问您的密钥,这基本上会使客户端加密毫无意义。这就是公钥加密被发明并被 https 使用的全部原因。所以,就让 https 来保护客户端和服务器之间传输的数据吧。

您可以进行公钥/私钥加密,其中您的服务器有一个私钥,并且您将公钥提供给客户端并使用它来加密数据,但目前尚不清楚您从中获得了什么好处,因为数据应该已经在通过 https 的公钥/私钥加密传输时受到保护。

一旦数据在服务器上并且您想将其存储在数据库中,关于您是否要使用服务器存储且安全的对称密钥在数据库中对其进行加密的单独讨论。有时这是个好主意,但有时由于各种原因(主要是密钥本身并不比数据库更安全),这样做并不能真正提高您的安全级别。

我不知道你为什么会在服务器上使用公钥/私钥加密。如果所有内容都存储在服务器上,那将是一堆额外的计算,没有真正的好处。使用公钥/私钥加密的一个重要原因是,您可以将公钥提供给任何想要向您发送加密数据的人,但该公钥不能用于解密用它加密的数据。为此,必须拥有私钥。对于完全保存在服务器上并由服务器管理的数据,您已经必须保护私钥,因此您不妨只使用对称密钥并对其进行保护。没有您要求加密数据的“第三方”,而没有解密数据的能力,这是公钥/私钥加密的主要原因。

【讨论】:

  • @michaellee - 这回答了你的问题吗?
猜你喜欢
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
相关资源
最近更新 更多