在Perl中创建安全随机数的方法有很多种。大多数这些方法涉及一个或多个Perl模块。其中许多Perl模块需要更多的Perl模块作为依赖项。
由于我希望保持轻量级并减少所需的依赖性,我决定使用Math::Random::ISAAC
,并自己从/dev/urandom
播种。
那么,推荐的方法是在Perl中读取来自/dev/urandom
的128位(我猜这是一个很好的数据),而不使用其他模块,然后将其传递给{ {1}}?
我不知道阅读和格式化的正确方法是什么,这里有the sub I will be passing the seed to:的副本
ISAAC
我不是数组,标量,字节串等细节的专家;所以我真的不知道如何将sub new {
my ($class, @seed) = @_;
my $seedsize = scalar(@seed);
my @mm;
$#mm = $#seed = 255; # predeclare arrays with 256 slots
# Zero-fill our seed data
for ($seedsize .. 255) {
$seed[$_] = 0;
}
my $self = {
randrsl => \@seed,
randcnt => 0,
randmem => \@mm,
randa => 0,
randb => 0,
randc => 0,
};
bless($self, $class);
$self->_randinit();
return $self;
}
数据格式化为urandom
。我确实认为128位是充足的随机性,但我不知道如何确保所有熵都使其成为@seed
,并防止它在此过程中被截断为64位或32位。 / p>
答案 0 :(得分:3)
从查看使用种子的ISAAC代码来看,它似乎需要32位值。所以:
use autodie;
open(my $fh,'<','/dev/urandom');
my $buffer;
read($fh, $buffer, 16) == 16 or die "not enough read";
my @seed = unpack 'L4', $buffer;
my $isaac = Math::Random::ISAAC->new(@seed);