有没有更好的方法在perl cgi脚本中提供适当的密码哈希?

有没有更好的方法在perl cgi脚本中提供适当的密码哈希?,perl,passwords,sha256,Perl,Passwords,Sha256,好吧,我花了好几天的时间在这里和其他地方查看代码,我只是不断地把各个部分拼凑在一起。这个脚本适合我,我仍然在检查安全漏洞,但是我已经尽力创建了它。我不是perl天才,对regexp有点生疏 这个脚本的目的将被用作聊天室的嵌入式密钥,我很可能会使用原始的crypt来分支第二个密钥,因此在有人开始分离生成的打印页面层时,会进行额外的步骤和模糊处理。我不希望将用于登录的密钥与嵌入的密钥存储在数据库中,但出于明显的原因,它们需要相同的根传递。我可能在太多的地方有过多的清理字符,但我想为什么不呢,以防我把

好吧,我花了好几天的时间在这里和其他地方查看代码,我只是不断地把各个部分拼凑在一起。这个脚本适合我,我仍然在检查安全漏洞,但是我已经尽力创建了它。我不是perl天才,对regexp有点生疏

这个脚本的目的将被用作聊天室的嵌入式密钥,我很可能会使用原始的crypt来分支第二个密钥,因此在有人开始分离生成的打印页面层时,会进行额外的步骤和模糊处理。我不希望将用于登录的密钥与嵌入的密钥存储在数据库中,但出于明显的原因,它们需要相同的根传递。我可能在太多的地方有过多的清理字符,但我想为什么不呢,以防我把它作为一个单独的文件

use Digest::SHA qw(hmac_sha256_hex);

sub passCrypt {
    chomp(my $userin=$_[0]);            # first passed var is username
    chomp(my $passin=$_[1]);            # second passed var is plaintext password
    $userin = substr $userin, 0, 24;    # protect from DoS attacks by limiting length of input
    $passin = substr $passin, 0, 64;
    $passin =~ tr/\\\?\/\<\>/XPZQJ/;    # clean password replacing \ ? / < > with safe chars
    $passin =~ s/0x[0-9a-fA-F]//g;      # clean password from hex 0x0 - 0xF
    $userin =~ s/[^\w]//g;              # clean username from any non-word characters (a-z A-Z 0-9 _)
    $userin =~ s/[_]//g;                # clean username from the _ (for salt)
    $userin = lc($userin);              # all lowercase username
    my $salt = substr($userin, 1, 1) . substr($userin, -2, 1);  # make salt from first and last of username
    my $clnpass = crypt($passin,$salt);  # use basic crypt to prevent plain text password being utilized beyond this point
    $clnpass = substr $clnpass, 2;  # strip salt from beginning of pass
    $clnpass =~ tr/\/\\\!\@\#\$\%\^\&\*\(\)\[\]\{\}\|\?\=\+\-\_\<\>\:\;\"\'\`\,\./1234567890123456789012345678901/;  # make pass filename safe (replacement to keep consistent length)
    $clnpass =~ tr/abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ/WXYZwxcd123efghFGHIJij4ABlmnopqNOPQRrstuCDEKL567MSkyzTUVa890/;  # added obfuscation
    $clnpass = reverse($clnpass);  # more obfuscation
    my $cryptpass = hmac_sha256_hex($clnpass, chr(0x0b) x 32);  # final crypt with sha256
    return $cryptpass; 
}
使用摘要::shaqw(hmac_sha256_hex);
子密码{
chomp(my$userin=$35;[0]);#第一个传递的变量是username
chomp(my$passin=$35;[1]);#第二个传递的变量是明文密码
$userin=substr$userin,0,24;#通过限制输入长度来防止DoS攻击
$passin=substr$passin,0,64;
$passin=~tr/\\?\/\/XPZQJ/;#用安全字符替换干净的密码\?/<>
$passin=~s/0x[0-9a-fA-F]//g;#清除十六进制0x0-0xF中的密码
$userin=~s/[^\w]//g;#清除任何非单词字符中的用户名(a-z a-z 0-9)
$userin=~s/[\]//g;#从(用于salt)中清除用户名
$userin=lc($userin)#所有小写用户名
我的$salt=substr($userin,1,1)。substr($userin,-2,1);#从用户名的第一个和最后一个开始制作盐
my$clnpass=crypt($passin,$salt);#使用基本密码可以防止纯文本密码被使用到超过这一点
$clnpass=substr$clnpass,2;#从焊道开始剥盐
$clnpass=~tr/\/\\!\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
$clnpass=~tr/abcdefghijklmnopqrstuvxyz1234567890abcdefghijklmnopqrstuvxyz/wxyzwxcd123efghfghhijij4ablmnopqrnopqrstucdek567mskyztuva890/;#添加了混淆
$clnpass=反向($clnpass)#更多混淆
我的$cryptpass=hmac_sha256_hex($clnpass,chr(0x0b)x 32);#带有sha256的最终密码
返回$cryptpass;
}
我把它放在这里,以防其他人在搜索时遇到与我类似的问题,并希望得到许多改进建议。有没有更好的方法在perl cgi脚本中提供体面的密码哈希?我首先查看了Crypt::Eksblowfish::Bcrypt,但我的主机没有这个包。提前感谢


编辑:向我澄清,我所做的只是散列,所以我替换了前面提到的文本。

您代码中的安全性基本上依赖于
crypt
hmac_sha256
。其余的是混淆。考虑到脚本可能与密码散列位于同一系统中(这里没有加密,只是散列)模糊处理实际上不太可能有助于抵御攻击者——任何访问密码哈希的人都可能访问您的代码

这使得
crypt
hmac_sha256
都是快速散列函数,因此本质上您可以创建一个用于密码散列的快速函数。但使用快速散列意味着攻击者也可以快速强制任何现有散列。这就是为什么密码散列的一个重要设计标准是足够慢


有关如何正确散列密码的详细信息,请参阅。请不要发明您自己的方法,而是使用现有方法。在安全方面,最好依靠经验证的方法,而不是发明您自己的方法,因为这些方法可能对您安全,但对其他人不安全。

您的代码中的安全性基本上依赖于
crypt
hmac_sha256
。其余部分是模糊处理。考虑到脚本可能与密码散列位于同一系统中(这里没有加密,只是散列),模糊处理实际上不太可能有助于抵御攻击者-任何访问密码散列的人都可能访问您的代码

这使得
crypt
hmac_sha256
都是快速散列函数,因此本质上您可以创建一个用于密码散列的快速函数。但使用快速散列意味着攻击者也可以快速强制任何现有散列。这就是为什么密码散列的一个重要设计标准是足够慢


有关如何正确散列密码的更多详细信息,请参阅。请不要发明自己的方法,而是使用现有的方法。在安全方面,最好依靠经验证的方法,而不是发明自己的方法,因为这些方法可能对您安全,但对其他人不安全。

因此,采纳Steffen的所有建议,这就是我最后得到的,将改变一个错误很少有关于我实际使用的内容的细节,因为这可能与我将使用的内容类似,坦白地说,如果我继续发布我的脚本,安全性似乎很愚蠢

use Digest::SHA qw(hmac_sha512_hex hmac_sha256_base64);
use Crypt::PBKDF2;

my $hash = &MakeHash($username,$password); #test
print &MakeSessionID($hash); #test

sub MakeHash {
  chomp(my $userin=$_[0]);  #i do this as a habbit when I work with files, I know this info should not be coming from a file, I will clean it up later
  chomp(my $passin=$_[1]);
  $userin = substr $userin, 0, 24;  #keeping this to prevent accidents while I keep working
  $passin = substr $passin, 0, 64;
  my $hashkey = hmac_sha256_base64($userin,$userin);
  my $pbkdf2 = Crypt::PBKDF2->new(hash_class => 'HMACSHA1',iterations => 200000,output_len => 24); #these are not the values im actually using but close enough
  my $result = $pbkdf2->PBKDF2_base64($hashkey,$passin);
  return $result; }

sub MakeSessionID {
  chomp(my $passin=$_[0]);
  my $salt = time*2;
  my $result = hmac_sha512_hex($passin, $salt);
  return $result; }

很明显,我错过了利用这个功能的功能,但是的,所以采纳Steffen的所有建议,这就是我最终得到的,将改变我实际使用的一些细节,因为这可能与我将要使用的类似,坦率地说,如果我继续发布脚本,安全性看起来很愚蠢

use Digest::SHA qw(hmac_sha512_hex hmac_sha256_base64);
use Crypt::PBKDF2;

my $hash = &MakeHash($username,$password); #test
print &MakeSessionID($hash); #test

sub MakeHash {
  chomp(my $userin=$_[0]);  #i do this as a habbit when I work with files, I know this info should not be coming from a file, I will clean it up later
  chomp(my $passin=$_[1]);
  $userin = substr $userin, 0, 24;  #keeping this to prevent accidents while I keep working
  $passin = substr $passin, 0, 64;
  my $hashkey = hmac_sha256_base64($userin,$userin);
  my $pbkdf2 = Crypt::PBKDF2->new(hash_class => 'HMACSHA1',iterations => 200000,output_len => 24); #these are not the values im actually using but close enough
  my $result = $pbkdf2->PBKDF2_base64($hashkey,$passin);
  return $result; }

sub MakeSessionID {
  chomp(my $passin=$_[0]);
  my $salt = time*2;
  my $result = hmac_sha512_hex($passin, $salt);
  return $result; }

很明显,我错过了利用此功能的功能,但是的

我投票将此问题作为主题外的问题来结束,因为这里没有实际问题。请注意,stackoverflow.com是一个严格的Q+a网站,而不是通用代码共享网站。除此之外,它根本不是加密,而是哈希。抱歉,我猜我使用了主题作为我的问题。用例我不清楚。这看起来像是试图编写自己的密钥派生函数。不知道最后这个密钥是用来做什么的。”这个脚本