C函数密码匹配盐渍sha1

时间:2017-12-13 15:49:15

标签: c perl sha1 pam

我正在使用perl函数在sha1中使用salt生成密码。

sub  set_new_password{
    my ($newpass)=@_;
    $salt='4Ly5W7xx';
    $pass= encode_base64(sha1($newpass.$salt).$salt);
    return $pass;
}

现在我必须在C程序中验证此密码。 有像https://pastebin.com/CPC1vYAK这样的sha1验证器,但我如何使用salt验证密码

是否有一些我可以从

复制的样本

1 个答案:

答案 0 :(得分:1)

首先,您现有的代码存在严重的安全漏洞。盐不应该是恒定的。每个密码都应使用不同的随机盐。

use Math::Random::Secure::RNG qw( );  # Or some other cryptographic-safe number generator

use feature qw( state );

sub generate_salt {
    state $rng = Math::Random::Secure::RNG->new();
    my $uint32 = $rng->irand();
    return pack('N', $uint32);
}

sub hash_password {
    my ($password, $salt) = @_;
    return sha1($password . $salt);
}

sub encode_password {
    my ($plaintext_password) = @_;
    my $salt = generate_salt();
    my $hashed_password = hash_password($plaintext_password, $salt);
    return join('-',
       encode_base64($salt, ''),
       encode_base64($hashed_password, ''),
    );
}

sub is_correct_password {
   my ($plaintext_password, $encoded_password) = @_;
   my ($salt_base64, $hashed_password_base64) = split(/-/, $encoded_password);
   my $salt = decode_base64($salt_base64);
   my $hashed_password = decode_base64($hashed_password_base64);

   return hash_password($plaintext_password, $salt) eq $hashed_password;
}

更改密码:

my $plaintext_password = '...from user...';
my $encoded_password = encode_password($plaintext_password);

检查密码:

my $plaintext_password = '...from user...';
my $encoded_password = '...from storage...';
if (!is_correct_password($plaintext_password, $encoded_password)) {
   die("Authentication error\n");
}

但这仍然是错误的。 sha1太弱了。应该使用至少10,000次迭代的PBKDF2