perl代码中的/ dev / urandom

时间:2015-08-18 14:28:59

标签: linux perl shell

我正在尝试为我的perl代码中的某些特定用途生成随机数。

我能够找出linux及其工作正常的命令。

cat /dev/urandom | tr -dc 'a-zA-Z0-9-_!@#$%^&*()_+{}|:<>?=' | fold -w 10 | grep -i '[!@#$%^&*()_+{}|:<>?=]' | head -n 1

我无法在perl中使用相同的命令。我是perl和编程的新手。

我尝试过研究相同但不能使它在perl中工作。

任何建议或任何其他方式如果有人可以建议我如何在perl中生成随机数。

如果有任何问题,请告诉我。 谢谢你的帮助

1 个答案:

答案 0 :(得分:3)

您可以使用以下内容,但不符合加密标准:

my @syms = ('a'..'z', 'A'..'Z', '0'..'9', split(//, '-_!@#$%^&*()_+{}|:<>?=') );

my $random = join '', map $syms[rand(@syms)], 1..10;

如果您尝试生成密码,以下是对原始解决方案的改进。虽然它降低了密码的熵(使其更容易受到无人使用的暴力攻击),但它通过保证混合字符类型来增加抵抗字典攻击的机会。

my @lc = 'a'..'z';
my @uc = 'A'..'Z';
my @na = ( '0'..'9', split(//, '-_!@#$%^&*()_+{}|:<>?=') );

@$_ = grep !/^[0O1liI]\z/, @$_
    for \@lc, \@uc, \@na;

my @all = ( @lc, @uc, @na );

sub gen_password {
    return
        join '',
            shuffle
                map($all[rand(@all)], 1..4),
                map($lc[rand(@lc)],   1..2),
                map($uc[rand(@uc)],   1..2),
                map($na[rand(@na)],   1..2);
}