【问题标题】:What if, a public key was stored on the server?如果公钥存储在服务器上怎么办?
【发布时间】:2012-07-19 17:33:07
【问题描述】:

公钥和私钥对在客户端通过 java 脚本算法创建,然后将公钥传输到服务器。

个人私钥的副本以 java 脚本变量的形式存储在用户计算机上。

当用户 A 向用户 B 发送消息时

服务器使用用户 B 的公钥加密消息。

用户 B 获取消息并使用用户 B 的私钥解密(用 java 脚本编写的算法),该私钥是私有的并保存在 java 脚本变量中。

用户 B 的私钥在任何时候都不会通过网络公开。

这样安全吗???

【问题讨论】:

  • 如果以下任何答案对您有用,请标记为已接受,这样人们就不会再花时间在这个问题上了。
  • 在任何人回答“这样安全吗”这个问题之前,您需要解释一下您的威胁模型是什么。也就是说,谁是你的攻击者,他们的目标是什么,他们有什么资源?

标签: algorithm private public public-key-encryption


【解决方案1】:

'public' 和 'private' 只是两个键的名称。两个密钥中的 哪个 是公开的,哪个是私有的并不重要,只要您从不混淆使用。一旦两个密钥同时可供某人使用,消息传递系统的安全性就会被彻底破坏。

从技术上讲,由于您说密钥存储在 javascript 变量中,因此您暗示这些变量是以嵌入在某些基于浏览器的 html/javascript 中的 CLEAR 形式发送的。这进一步意味着没有安全性 - 因为两个密钥都暴露在网络中。

【讨论】:

  • 回复:“既然您说密钥存储在 javascript 变量中,那么您的意思是这些变量是在嵌入在某些基于浏览器的 html/javascript 中的 CLEAR 中发送的”:这不是真的。 OP 明确指出“公钥和私钥对是通过 java 脚本算法在客户端创建的,然后将公钥传输到服务器。”
  • "'public' 和 'private' 只是给两个密钥的名称。两个密钥中哪个是公共的,哪个是私有的并不重要” - 这是一个概括,并且作为这并不总是正确的。一些 PK 算法以这种方式是对称的,而另一些则不是。
【解决方案2】:

要确定某项内容是否“安全”,您必须知道安全要求是什么。您的案例满足了一些可能的要求,但它确实满足了一些可能的要求。例如:

  • 消息的明文副本显然是通过网络从用户 A 传输到服务器的,因此任何人都可以在此时窃听它。 (这可能是一个严重的问题。)
  • 您没有解释如何将公钥传输到服务器。如果它没有以经过身份验证的方式传输,那么中间人可以生成他自己的公钥-私钥对,并将他的公钥提供给服务器。 (这可能是一个严重的问题。)
  • 用户 B 无法验证他收到的消息的真实性。该消息可能来自服务器(最终来自用户 A),也可能来自其他任何拥有公钥副本的人。 (这可能是也可能不是一个严重的问题,具体取决于应用程序。)

所以总的来说,我认为这种设计是“安全的”。

【讨论】:

    【解决方案3】:

    它不会太安全,因为:

    • 任何用户(比如用户 B)的私钥都可能通过注入的 JS 代码或不良浏览器插件从您的应用中泄露出来
    • 完成此操作后,任何可以访问针对用户 B 的任何消息的人都将能够解密并理解它
    • 当然,如果您是唯一使用该应用的人,则上述情况不会发生 - 因为您可能会有其他用户使用不同的浏览器设置/插件/浏览行为等,这是完全有可能的
    • 当用户 A 尝试向用户 B 发送内容时,您说服务器将使用用户 B 的公钥加密消息 - 现在,通过 JS 发出的这个请求可以由中间人解释。完成后,这个中间人可以通过操纵发件人、引荐人等向任何用户发起任何请求。这可能会导致假冒等..
    • 您还提到,在生成之后,您打算将公钥发送到服务器。这个 JS 调用很容易被解释,这意味着公钥可能会被泄露。

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 2018-05-15
      • 2023-03-29
      • 2017-08-23
      • 1970-01-01
      • 2017-07-25
      • 2013-09-13
      • 2018-09-13
      • 1970-01-01
      相关资源
      最近更新 更多