可验证的随机数

时间:2019-02-01 07:25:38

标签: java algorithm random token random-seed

我需要生成一个10位随机数作为交易参考。该号码必须通过此服务生成的某种方式可验证。例如,如果有人针对从未使用任意参考号进行的交易提出争议,则系统应该能够验证该号是否由服务生成(尽管可以向数据库查询给定的号,但是是不同的),方法是验证给定的数字是否符合格式(例如使用校验和/摘要)。我可以想到下面介绍的一些方法

方法1:将此随机数的某些部分添加为系统内部的一部分,例如IP,MAC地址,时间戳,客户的哈希值及其他。

由于某些静态/较小动态部分占用了数字,因此减少了随机性。但是,任何知道此模式的人都可以生成数字,除非该值不是内部的。

方法2: Mod-97 10将摘要附加到此号码,以便对其进行验证。但是,我相信,也可以由知道每个随机数都附带摘要的任何人来生成。我说的对吗?

方法3::生成摘要,其中包括系统中的秘密密钥。除非有人知道密钥,否则他们无法创建带有摘要的随机数。

你们中的任何人以不同的方式解决了这个问题吗?如果您能为我指出该解决方案的方向,或者给我一个答案,将非常高兴。

欢呼

2 个答案:

答案 0 :(得分:0)

生成一个随机数并用私钥签名。因此,某些数字将是随机数,至少是数字的一半。一些数字将是签名。发布您的公钥和系统,任何人都可以验证签名,但是只有您才能生成它,因为只有您拥有私钥。搜索PKI(公钥基础结构)。

当然,如果仅将例如三位数字用于签名,则有1000种可能性,而拥有计算机的人将很容易尝试全部1000种,然后看看哪一个可以验证。即使使用5位数的随机数和5位数的签名,您也容易受到这种蛮力攻击。

最好签署整个交易,而不仅仅是随机参考号。为了确保安全,仅签名就需要数百位或数千位。

Wikipedia链接:Public key infrastructure

答案 1 :(得分:-1)

public static void main(String args[])
{    
    generateMyNumber();
}

public static void generateMyNumber()
{
    Random t = new Random();
    Random rand = new Random();
    for (int c = 1; c <= 10; c++) 
    {
        long number = rand.nextInt(999999999)* 9999999999L;
        System.out.println(number);
    }
}