首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用using php用salt加密/解密密码

如何使用using php用salt加密/解密密码
EN

Stack Overflow用户
提问于 2017-05-23 09:59:40
回答 2查看 3.4K关注 0票数 0

我想得到的是

  • 用libsodium加密密码+盐类
  • 将其存储到数据库中
  • 读取并解密它(获取用于身份验证的普通密码)

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

我是使用了错误的方法加密/解密的利伯钠,还是我完全在错误的方向开车?

我的加密/解密源:

代码语言:javascript
复制
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;
    }

我很感激你的帮助!

看待多姆

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-23 11:08:15

如果您不需要专门使用store,使用此函数,您应该能够将加密的数据存储在数据库中并对其解密。

代码语言:javascript
复制
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;
}

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

票数 1
EN

Stack Overflow用户

发布于 2017-05-23 13:11:23

看起来你想把很多不相关的东西混在一起。CRYPTO_SIGN_SEEDBYTES用于签名,这与密码哈希无关,crypto_pwhash不使用氪t算法,因此CRYPTO_PWHASH_SCRYPTSALSA208SHA256_*常量不适用,我不确定md5()在这里做什么。你可能想要破解密码,而不是加密它。

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

代码语言:javascript
复制
$password = 'correct horse battery staple';
$h = \Sodium\crypto_pwhash_str($password,                                   
         \Sodium\CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
         \Sodium\CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE);

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

然后,要验证数据库中的内容对于给定密码是否有效:

代码语言:javascript
复制
if (\Sodium\crypto_pwhash_str_verify($h, $password) === FALSE) {
    // wrong password!
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44131607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档