代码之家  ›  专栏  ›  技术社区  ›  AndrewC

验证是否已通过哈希/加密“完成”某些操作

  •  3
  • AndrewC  · 技术社区  · 14 年前

    所以,首先,我想指出的是,我知道这些东西永远不会是万无一失的,如果付出足够的努力,任何东西都可能被打破。

    但是:假设我把一个软件交给某人(我写的),让他们运行它。我想验证他们得到的结果。我在考虑使用某种加密/散列,我可以用它来验证他们是否运行了它并获得了令人满意的结果。

    我也不希望结果是“伪造的”(尽管如此,我知道如果足够的努力来打破它是应用等…)。因此,这意味着,如果我使用散列,我不能只有一个“是”的散列和一个“否”的散列(因为这意味着散列只是两个选项中的一个-很容易伪造)。

    我希望该工具的用户把一些东西交给我(例如,在电子邮件中),一些尽可能小的东西(例如,我不想在一行又一行的日志中拖网)。

    你将如何着手实施这个计划?我可能还没有解释清楚,但希望你能理解我想做的事情的要点。

    如果有人以前实现过这类东西,任何指针都会非常感激。

    这个问题更多的是关于“如何实现”,而不是专门问代码,所以如果我错过了一个重要的标签,请随时编辑!

    6 回复  |  直到 14 年前
        1
  •  3
  •   Piskvor left the building Rohit Kumar    14 年前

    我想你要找的是 non-repudiation PKI . 这是一个相当广泛的领域,我想说你需要认证和完整性验证(例如。 皮斯科沃 他做到了,他做到了 完全 那个 时间)。

    从鸟瞰的角度来看,主要流程如下:

    • 运行进程
    • 获取结果,添加时间戳等。
    • 使用公钥加密
    • 发送到服务器

    • 使用用户的公钥验证签名

    当然,这会让你进入一个复杂而美妙的世界,那就是公钥基础设施;但是如果做得正确,您将有一个相当好的保证,事件实际上是按照您的日志显示的方式发生的。

        2
  •  3
  •   caf    14 年前

    我把你的一条评论贴在这里,因为它触及了问题的核心:

    嗨,埃里克。我应该指出的 工具不会坏的 公开地说,这将是一个选择 可信用户列表。正在使用的工具 拆卸不是问题。我没有 真的很担心加密,好吗 我需要做的是能够证实这一点 他们运行了一个特定的过程,得到了一个 合法的结果。工具验证 所以我不想让他们 假设某个东西运行良好 不运行工具。

    所以基本上,我们要保护的威胁是懒惰的用户,他们将无法运行进程,只需说“是的,安迪,我运行了它!”。这不是很难解决,因为这意味着我们不需要一个加密的牢不可破的系统(这是幸运的,因为这在这种情况下是不可能的!)我们所需要的只是一个系统,在这个系统中,打破它比仅仅遵循规则和运行流程更重要。

    • 系统日期/时间
    • 主机名
    • 试验结果
    • 哈希(系统日期/时间|主机名|用户名|测试结果)

    再说一遍,这个 不是吗 密码安全-任何知道算法的人都可以伪造答案-但只要这样做比实际运行过程更麻烦,你就应该没事。包含系统日期/时间可以防止幼稚的重放攻击(只发送与上次相同的答案),这应该足够了。

        3
  •  2
  •   Community Mr_and_Mrs_D    7 年前

    你把程序的输出(或者是“yes”或者“no”)和一个随机数连接起来,然后包含这个字符串的散列,怎么样?

    因此,最终用户会向您发送以下内容:

    YES-3456234
    b23603f87c54800bef63746c34aa9195
    

    这意味着,尽管只有两种可能的输出,但仍会有大量独特的散列。

    那你可以核实一下 md5("YES-3456234") == "b23603f87c54800bef63746c34aa9195" .

    如果用户没有足够的技术来解决如何生成md5散列,这就足够了。

    一个稍微好一点的解决方案是串联 另一个 (硬编码,“secret”)salt以生成散列,但将此salt保留在输出之外。

    现在您有:

    YES-3456234
    01428dd9267d485e8f5440ab5d6b75bd
    

    md5("YES-3456234" + "secretsalt") == "01428dd9267d485e8f5440ab5d6b75bd"

    这意味着,即使用户足够聪明,能够生成自己的md5散列,他也不能在不知道秘密salt的情况下伪造输出。

    当然,如果他足够聪明,他可以从你的程序中提取盐。

    如果需要更加防弹的东西,那么您将看到正确的加密签名生成,我将向您介绍 Piskvor's answer ,因为我没有什么有用的补充:)

        4
  •  1
  •   Community Mr_and_Mrs_D    7 年前

    用户将其结果和程序生成的签名发送给您。所以你现在可以通过检查 hash(result + private_salt) == signature . 如果不是,结果就是伪造的。

    实际上这几乎是不可能的,因为你不能对用户隐藏盐。基本上和这个问题讨论的问题是一样的: How do you hide secret keys in code?

        5
  •  1
  •   Jeffrey L Whitledge    14 年前

    一旦用户手中有一个可执行程序,那么任何东西都可能被伪造。

        6
  •  1
  •   Dan Puzey    14 年前

    加密

    “不可否认”的答案几乎是金钱,但你真正需要保证的是你的信息从哪里来的安全 签名 信息。有人能不能拦截并阅读你的信息并不重要,只要他们不能在你不知情的情况下篡改。

    在明文发送信息之前,我已经实现了类似的功能——因为它不是机密信息——但是一个模糊的签名机制意味着我们可以(合理地)确信消息是由我们的客户端软件生成的。

    请注意,基本上永远 安全如果应用程序安装在其他人的硬件上-但安全性从来不是“确定性”,而是“信心”-你有信心吗 足够地 为了您的业务需要,邮件没有被篡改?