所以,首先,我要指出,我知道这些事情从来都不是万无一失的,如果付出足够的努力,任何事情都可能被打破.
但是:假设我将一个软件交给某人(我已写过)并让他们运行它.我想验证他们得到的结果.我正在考虑使用某种加密/散列,我可以用它来验证它们是否运行它并获得了满意的结果.
我也不希望结果是“可伪造的”(尽管如此,我知道如果有足够的努力来打破它等等……).因此,这意味着,如果我使用哈希,我不能只有“是”的哈希值和“否”的哈希值(因为这意味着哈希将只是2个选项中的一个 – 很容易伪造).
我希望该工具的用户可以将一些东西交回给我(例如可能是一封电子邮件),尽可能小的东西(例如,我不希望通过行和日志行进行拖网).
你会如何实现这个?我可能没有解释最伟大的事情,但希望你能得到我想要做的事情的要点.
如果有人之前已经实现过这种事情,那么任何指针都会非常感激.
这个问题更多的是关于“如何实现”而不是专门询问代码,所以如果我错过了一个重要的标签,请随时编辑!
解决方法:
我认为你要找的是non-repudiation.你是对的,这里的哈希是不够的 – 你必须在“完成的工作”上查看某种加密和数字签名,可能是PKI.这是一个相当广泛的领域,我会说你需要身份验证和完整性验证(例如Piskvor这样做,他当时这样做了).
从鸟瞰图来看,主要流程如下:
在用户的计算机上:
>运行过程
>获取结果,添加时间戳等
>使用您的公钥加密
>签名,使用用户的私钥(您可能需要某种方式来识别用户 – 密码,智能卡,生物识别,…)
>发送到您的服务器
在您的服务器上:
>使用用户的公钥验证签名
>使用您的私钥解密
>根据需要处理
当然,这可以让您进入复杂而美妙的世界,即公钥基础设施;但是如果做得正确的话,你可以很好地保证事件的实际发生方式与你的日志显示方式相同.