【问题标题】:Store encrypted texts in the database , query and decrypt it back base on password将加密文本存储在数据库中,根据密码进行查询和解密
【发布时间】:2021-11-28 15:58:01
【问题描述】:

我正在尝试将加密文本存储在我的数据库中,但我不知道如何将其解密回来。我试过了

$salt   = 'c0d4#';
$pepper ='nsa-cia-fbi'; // secret text

$pwd_peppered = hash_hmac("sha256", $salt, $pepper);
$pwd_hashed = password_hash($pwd_peppered, PASSWORD_ARGON2ID);

echo($pwd_hashed);

// right password hash 
$pwd_hashed = '$argon2id$v=19$m=65536,t=4,p=1$QnVpT1Rqay5WSmIvRW1HZg$rgx+DWPl5bvjwlr7plnOjnE1Sf8lim01pwb6lHGzEaU';

//wrong password hash : for testing purposes 
$pwd_hashed_wrong = '$argon2id$v=19$m=65536,t=4,p=1$QnVpT1Rqay5WSmIvRW1HZg$rgx+DWPl5bvjwlr7plnOjnE1Sf8lim01pwb6lHGzEaU-wrong-!!';

if (password_verify($pwd_peppered, $pwd_hashed)) {
    echo "Password matches.";

   // I am inside this block of codes, but ... 
   // no idea how to decrypt and get my text back ... ????



}
else {
    echo "Password incorrect.";
}

【问题讨论】:

  • 加密与散列不同。您可以将加密令牌存储在数据库中,并在从数据库中检索时对其进行解密,但如果您散列某些内容,则无法取消散列。
  • 为什么要重新发明轮子?使用JWT,它们使用密钥签名,因此您可以确保数据的完整性。
  • @TimLewis 感谢您的解释。您推荐的最佳加密是什么?
  • laravel.com/docs/8.x/encryption。 Laravel 内置了这个功能。当你想存储一个加密的令牌时,你可以将其设置为 Crypt::encryptString($plainTextToken),检索后,你将通过 Crypt::decryptString($encryptedToken); 解密。旁注,如果您在 password 上使用它,您将面临严重的安全漏洞。
  • 停止尝试将盐附加到您的明文中,这是一个散列的事情。 [IMO 辣椒普遍无用,但这是另一个论点] 一个像样的密码将使用初始化向量 [IV],一个像样的加密库 [例如:laravel 的,希望] 将对您透明地处理。

标签: php laravel laravel-5 encryption cryptography


【解决方案1】:

您无法解密散列文本,如果要进行密码验证,则必须对用户输入的密码进行散列并使用真实密码的散列进行测试(查看 2 散列是否相等)

【讨论】:

  • 我需要能够解密,否则无法使用。想象它是一个令牌。我只是不想将令牌作为纯文本存储在数据库中,并试图添加一层加密。这是我的主要目标。
  • 这不太正确。您可以解密加密文本,但您不能取消散列散列文本。你的答案是对的,但你的措辞有点错误。
  • 是的,但在您的代码中,您使用的是散列函数“sha256”
  • 而散列函数是单向函数,您可以使用 sha256 散列文本(就像您所做的那样),但由于 SHA256 是散列函数,而不是加密函数,您无法解密它
【解决方案2】:

有两个概念,hashencrypt。当你散列一个字符串时,你不能把它变回原来的字符串。密码必须经过哈希处理,然后您才可以存储它们。 如果您加密字符串,您可以将结果转回原始字符串。 在 laravel 中,你可以使用 Illuminate\Support\Facades\Crypt 类。 有一个例子:

<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * Store a secret message for the user.
     *
     * @param  Request  $request
     * @param  int  $id
     * @return Response
     */
    public function storeSecret(Request $request, $id)
    {
        $user = User::findOrFail($id);

        $user->fill([
            'secret' => encrypt($request->secret)
        ])->save();
    }
}

use Illuminate\Support\Facades\Crypt;

$encrypted = Crypt::encryptString('Hello world.');

$decrypted = Crypt::decryptString($encrypted);

正如laravelthis 文档中所述。

【讨论】:

    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 2020-03-20
    • 2012-04-07
    • 1970-01-01
    • 2016-12-25
    • 2011-07-15
    • 1970-01-01
    • 2011-04-28
    相关资源
    最近更新 更多