【问题标题】:C function to password match salted sha1密码匹配加盐sha1的C函数
【发布时间】:2017-12-13 15:49:15
【问题描述】:

我正在使用 perl 函数在带有盐的 sha1 中生成密码。

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

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

有没有可以复制的样本

【问题讨论】:

  • 始终使用use strict; use warnings qw( all );!!!您显然有一些范围不正确的变量。
  • 当保存密码验证器时,仅使用哈希函数是不够的,并且仅添加盐对提高安全性无济于事。而是使用随机盐迭代 HMAC 约 100 毫秒的持续时间,然后将盐与哈希一起保存。最好使用PBKDF2Rfc2898DeriveBytesArgon2password_hashBcrypt 等函数或类似函数。关键是让攻击者花费大量时间通过蛮力查找密码。

标签: c perl sha1 pam


【解决方案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

【讨论】:

  • 1) 加盐可防止预先构建字典。 2) Salting 可以防止一次针对多个用户的字典攻击(这是使用字典攻击的通常方式)。 3) 加盐防止两个人拥有相同的密码,而不会拥有相同的编码密码。 4) 在使用密码的方式上,HMAC 仅在您可以找到sha1($plaintext_password) 的冲突时才有帮助,即它仅在 sha1 已损坏时才有帮助。 HMAC prevents 其他与此处无关的攻击。
  • sha1 有更好的选择,但 HMAC 与此无关。
  • 参见NIST Digital Identity Guidelines 2017 年 6 月。查看关于 PBKDF2 的部分。摘录:“合适的密钥派生函数的示例包括基于密码的密钥派生函数 2 (PBKDF2”、“密钥派生函数应使用经批准的单向函数,例如密钥哈希消息验证码 (HMAC )", "PBKDF2,成本因素是迭代次数....应该与验证服务器性能允许的一样大,通常至少 10,000 次迭代。"
  • @zaph, Re“将 SHA1 与盐一起使用是不安全的,不应该用于密码验证器。”,我已经承认了这一点,这是不同的那么你原来说的。
  • @zaph, Re "当前的攻击不依赖于预先构建字典(即 80 年代),而是依赖于快速散列方法,例如 SHA1 和常用密码字典。”,嗯,是哪一个。没有还是有?
猜你喜欢
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 2012-09-16
  • 2020-04-05
  • 2013-10-10
  • 2019-09-23
相关资源
最近更新 更多