如何在没有读取能力的情况下将数据存储在服务器上?

信息安全 加密 密码学 数据库 网站
2021-09-13 14:15:26

比方说,我们开发了一个社交网络网站,它允许在用户之间发送个人消息。我们不希望任何人(甚至我们)阅读这些消息,除了消息发送者和接收者。

是否可以?

2个回答

所以你可能想要的是公钥。

用户 A 将自己的公钥发送给用户 B,然后用户 B 可以使用用户 A 的公钥对消息进行加密。

用户 B 然后将加密消息发送回用户 A,用户 A 有一个与公钥匹配的私钥,用户 A 必须始终保留此 PRIVATE。使用私钥用户 A 可以解密来自用户 B 的消息。一旦加密的用户 B 无法解密消息,则公钥仅用于加密。

您正在寻找的内容已在许多技术中使用,我每天都使用与 PGP 类似的方法。

显然你会设计你的应用程序来考虑这一点来处理所有的密钥生成并将它们存储在个人设备上(永远不要将它们存储在你的服务器上)

另一种方法是使用预共享密钥和另一种类型的加密(如 AES),但这需要发送者和接收者知道相同的密钥。如果您只在网上交谈,就会有问题。

预共享密钥意味着用户每次对话都需要一个密钥,而 PPK(公共和私有)意味着许多人可以拥有用户的公钥,并且用户可以安全地持有该私钥。

您正在寻找的是一种称为公钥加密的东西。

比喻

类比是我们有两个人:Alice 和 Bob。爱丽丝想向鲍勃发送消息,但他们以前没有私下见过面,所以他们没有任何预先建立的秘密/密钥/等。

爱丽丝给鲍勃发消息说“我想给你发消息。请给我一个你有钥匙的开锁”。这个“锁”在加密世界中被称为公钥。

Bob 向 Alice 发送了一份开锁的副本(因为在加密世界中很容易复制东西)。爱丽丝将她的信息放在一个盒子里,并用鲍勃的锁锁住了盒子。然后 Alice 将锁定的盒子发送给 Bob。

Bob 收到邮件中的盒子并使用他的密钥(只有 Bob 可以访问)来解锁盒子。Bob 现在可以取出消息并阅读它。在加密世界中,这个私钥被称为,令人惊讶的是,私钥:)

将消息锁定在一个盒子中以使其他人无法阅读的过程称为加密

执行

加密货币的第一条规则是不要编写自己的加密货币。那是因为它非常容易搞砸,但这并不意味着你不应该使用已建立的加密实现。

我建议查看 JavaScript 加密库,例如 kbpgp、sjcl、tweetnacl 等。

正如其他用户所提到的,crypto 和 js 的一个大问题是用户无法确定您的服务器正在提供真正的 javascript。一个被黑的服务器可以发送代码,说它正在加密东西,但实际上是把它吸走给了一些邪恶的第 3 方。同时,无论您是否使用加密货币,这种担忧都是相关的,因此(imo)不应该阻止您通过使用加密货币来让世界变得更美好