encrypt_pw: avoid '+' for crypt salt
authorDietmar Maurer <dietmar@proxmox.com>
Thu, 30 Mar 2017 06:53:12 +0000 (08:53 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Thu, 30 Mar 2017 06:53:12 +0000 (08:53 +0200)
And make salt less predictable.

PVE/Auth/Plugin.pm

index 6b0298c..3356f69 100755 (executable)
@@ -130,11 +130,18 @@ sub parse_tfa_config {
     return $res;
 }
 
+my $salt_starter = time();
+
 sub encrypt_pw {
     my ($pw) = @_;
 
-    my $time = substr(Digest::SHA::sha1_base64 (time), 0, 8);
-    return crypt(encode("utf8", $pw), "\$5\$$time\$");
+    $salt_starter++;
+    my $salt = substr(Digest::SHA::sha1_base64(time() + $salt_starter + $$), 0, 8);
+
+    # crypt does not want '+' in salt (see 'man crypt')
+    $salt =~ s/\+/X/g;
+
+    return crypt(encode("utf8", $pw), "\$5\$$salt\$");
 }
 
 my $defaultData = {