当前位置: 首页 > 知识库问答 >
问题:

如何使用libphp对salt密码进行加密/解密

邓俊材
2023-03-14

我想得到的是

  • 使用libnail加密密码salt

我有一个列表的盐,我想用它来加密/解密我的密码。当我加密密码时,我得到一个哈希返回,这样一个似乎可以工作,但在解密时,我总是得到假返回值。

我是否使用了错误的方法对libnaude进行加密/解密,还是完全朝着错误的方向行驶?

我的加密/解密源:

function encrypt_libsodium($to_encrypt, $salt_to_use){
        if(!$data || !$salt_to_use){
            return null;
        }

        //get stored salt
        $this->key_ = substr(md5($this->pw_key[$salt_to_use].'_'), 0, $this->ks);

        //some libsodium specific stuff
        $out_len = \Sodium\CRYPTO_SIGN_SEEDBYTES;
        $ops_limit = \Sodium\CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE;
        $mem_limit =\Sodium\CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE;

        //create hash using libsodium
        $hash = \Sodium\crypto_pwhash($out_len, $to_encrypt, $this->key_,$ops_limit, $mem_limit);
        return $hash;
    }

    function decrypt_libsodium($hash, $salt_to_use){
        if(!$hash || !$what){
            return null;
        }

        //get stored salt
        $this->key_ = substr(md5($this->pw_key[$salt_to_use].'_'), 0, $this->ks);

        //get verification hash
        $decrypted = \Sodium\crypto_pwhash_scryptsalsa208sha256_str_verify($this->key_, $hash);
        return $decrypted;
    }

我感谢任何帮助!

多姆

共有2个答案

郑正文
2023-03-14

如果你不需要特别使用libNa,有了这个功能,你应该能够将加密的数据存储在数据库中并解密它。

define("ENCRYPT_METHOD", "AES-256-CBC");
define("SECRET_KEY","randomtextrandomtextforthesecretkey");
define("SECRET_IV", "randomtextforthesecretiv");
function encriptar($action, $string)
{
  $output = false;
  $key    = hash("sha256", SECRET_KEY);
  $iv     = substr(hash("sha256", SECRET_IV), 0, 16);

  if ($action == "encrypt")
  {
    $output = openssl_encrypt($string, ENCRYPT_METHOD, $key, 0, $iv);
    $output = base64_encode($output);
  }
  else if($action == "decrypt")
    {
        $output = base64_decode($string);
        $output = openssl_decrypt($output, ENCRYPT_METHOD, $key, 0, $iv);
    }
  return $output;
}

输出将是您将存储/获取到数据库的数据。

贺亦
2023-03-14

看起来你试图混合许多不相关的东西。CRYPTO_SIGN_SEEDBYTES用于签名,与密码散列无关,crypto_pwhash不使用scrypt算法,所以CRYPTO_PWHASH_SCRYPTSALSA208SHA256_*常量不适用,我也不适用确定md5()在这里做什么。你可能想要散列密码,而不是加密它。

无论如何,crypto_pwhash_str()函数可以完成你需要的一切。它创建一个盐,散列密码,并将结果(连同盐、算法及其参数)编码为字符串,您可以直接将其存储到数据库中:

$password = 'correct horse battery staple';
$h = \Sodium\crypto_pwhash_str($password,                                   
         \Sodium\CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
         \Sodium\CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE);

$h是存储在数据库中所需的全部内容。

然后,为了验证数据库中的内容对给定密码有效:

if (\Sodium\crypto_pwhash_str_verify($h, $password) === FALSE) {
    // wrong password!
}
 类似资料:
  • 我将AES与salt和IV一起用于加密和解密一个唯一的ID,但它给出了javax。加密。解密时出现BadPaddingException。 每次解密数据时给出的完整错误堆栈跟踪 加密方法- 解密方法 我是JCA的新手。

  • 本文向大家介绍C#使用 Salt + Hash 来为密码加密,包括了C#使用 Salt + Hash 来为密码加密的使用技巧和注意事项,需要的朋友参考一下 (一) 为什么要用哈希函数来加密密码 如果你需要保存密码(比如网站用户的密码),你要考虑如何保护这些密码数据,象下面那样直接将密码写入数据库中是极不安全的,因为任何可以打开数据库的人,都将可以直接看到这些密码。 解决的办法是将密码加密后再存储进

  • 我正在使用生成用户密码的强哈希值。我想登录用户,但不想通过网络以明文形式发送密码,如何检查密码是否正确(没有往返),因为它是加盐的? 我有一个客户端/服务器场景。客户端是台式计算机上的应用程序(不是网站,也不是超文本传输协议服务器)。 我怎样才能做到这一点?我只是走了这么远:我正在客户端上生成salt散列,从中形成一个mcf并将其发送到我的服务器。将mcf保存到数据库。我没有发送密码,只发送了实际

  • 我正在使用以下代码创建哈希密码和salt: 我正在数据库中存储HashedPassword和Salt。 现在我要验证用户登录时的密码: 这不起作用,我得到了一个完全不同的哈希密码,而不是存储在数据库中的密码。据我所知,您应该在用户登录时输入的密码之前预置salt,然后运行相同的哈希密码函数。上面不是等价于那个吗?

  • 本文向大家介绍C#对文件进行加密解密代码,包括了C#对文件进行加密解密代码的使用技巧和注意事项,需要的朋友参考一下 加密代码 解密代码如下 以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 我正在使用CryptoJS加密密码,下面是我正在使用的示例代码 当函数被执行时,它提供的数据如下所示 Salt:923CA1AB6DC88806B05F012C5F7DF49F脚本。JS:13:11 Salt_Hex:923CA1AB6DC88806B05F012C5F7DF49F脚本。JS:14:11密钥:1438927D9BC8A42B9689A93C0FEFC8506A5BE0819FEB2