0

这是我的情况的(简化)示例。
用户玩游戏并获得 200 分的高分。我用金钱奖励高分,即 1 欧元/10 分。用户将打印一张“收据”,上面写着他赢得了 20 欧元,然后他把它给了我,我确保收据是真实的并且以前从未使用过,然后我把他的奖品交给他。
显然,我的“问题”在粗体部分。我应该能够手动验证“收据”,但也欢迎使用其他离线方法的解决方案(即我手机的小型 .jar 应用程序)。此外,制作假收据一定很难。

到目前为止,这是我的想法,它们的优点和缺点。

  • 使用常用算法进行散列,即 SHA512

    • 优点:可以很容易地通过移动设备进行验证,具有很强的抵抗力以更高的值伪造它(如果使用依赖于上下文的盐,即用户名)。
    • 缺点:可以多次使用,不能手动验证。
  • 自制哈希算法

    • 优点:可以手动验证。
    • 缺点:可能容易坏,可以多次使用。
  • 证书代码:我有两个数据库中的代码列表,一个在服务器上,一个在我的手机上。每次打印收据时,都会在其中打印一张收据,并将其设置为“已使用”到数据库中。在我的手机上,我也这样做:我检查代码是否在数据库中并且尚未使用,然后在数据库中设置为“已使用”。

    • 优点:不允许多次使用相同的代码。
    • 缺点:伪造收据非常容易,无法手动验证。
4

2 回答 2

2

这听起来像是基于哈希的消息身份验证代码(HMAC) 算法的经典用例。 由于您的“手动”想法是“使用智能手机”,而不是“使用 pecil、paper 和 mind ”,因此您可以计算哈希并将其打印在收据上,然后在手机或后端进行验证服务器。

于 2013-01-18T12:09:19.053 回答
-1

“缺失点”是一次使用更多系统,以便它们一起以所需的方式工作。在这种情况下,我们可以使用 HMAC 来验证消息和“证书代码”列表,以确保不会一遍又一遍地使用相同的收据。
另一个想法也可能是散列将收据输出给客户端的时间并将其打印在收据上。当有人向您显示收据上的代码时,您确保尚未使用散列并且它是有效的(即消息产生该散列),然后将其添加到“已使用散列”列表中。

感谢@RossPatterson 建议 HMAC。

于 2013-01-18T18:14:21.550 回答