这是我的情况的(简化)示例。
用户玩游戏并获得 200 分的高分。我用金钱奖励高分,即 1 欧元/10 分。用户将打印一张“收据”,上面写着他赢得了 20 欧元,然后他把它给了我,我确保收据是真实的并且以前从未使用过,然后我把他的奖品交给他。
显然,我的“问题”在粗体部分。我应该能够手动验证“收据”,但也欢迎使用其他离线方法的解决方案(即我手机的小型 .jar 应用程序)。此外,制作假收据一定很难。
到目前为止,这是我的想法,它们的优点和缺点。
使用常用算法进行散列,即 SHA512
- 优点:可以很容易地通过移动设备进行验证,具有很强的抵抗力以更高的值伪造它(如果使用依赖于上下文的盐,即用户名)。
- 缺点:可以多次使用,不能手动验证。
自制哈希算法
- 优点:可以手动验证。
- 缺点:可能容易坏,可以多次使用。
证书代码:我有两个数据库中的代码列表,一个在服务器上,一个在我的手机上。每次打印收据时,都会在其中打印一张收据,并将其设置为“已使用”到数据库中。在我的手机上,我也这样做:我检查代码是否在数据库中并且尚未使用,然后在数据库中设置为“已使用”。
- 优点:不允许多次使用相同的代码。
- 缺点:伪造收据非常容易,无法手动验证。