可验证的随机数[关闭]

问题描述 投票:1回答:2

我需要生成一个10位数的随机数作为交易的参考。该号码必须以某种方式验证,该服务是由该服务生成的。例如,如果有人为永远不会发生任意引用号的事务提交争议,系统应该能够验证该号码是否是由服务生成的(尽管可以向数据库查询给定的号码,但是通过验证给定数字是否符合格式(例如使用校验和/摘要)来区别。我可以想到我在下面描述的一些方法

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

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

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

方法3:生成包含作为系统一部分的密钥的摘要。除非有人知道密钥,否则他们无法使用摘要创建随机数。

有没有人以不同的方式解决这个问题?如果你能指出我对这个解决方案的指示,或者给我一个答案,我会很高兴的。

干杯

java algorithm random token random-seed
2个回答
0
投票

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

当然,如果你只设置三个数字用于签名,那么有1000种可能性,对于拥有计算机的人来说,很容易尝试所有1000个并查看哪一个验证。即使有5位数的随机数和5位数的签名,你也很容易受到这种蛮力攻击。

可能更好地签署整个交易,而不仅仅是随机参考号。为了保证安全,您需要数百或数千位来进行签名。

维基百科链接:Public key infrastructure


-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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.