解密由 php 中的 md5 函数传递的哈希值以在编辑表单中显示原始密码

decrypt hashed passed by md5 function in php to display original password in the edit form

$customer->password = md5($this->request->data['password']);

数据库中的结果值为

edd37150ae53ddd72974a8b115a3b78e.

但是当我在编辑表单中调用密码时 echo $this->Form->input('password'); 它以哈希格式显示密码。你能告诉我如何在输入字段中获取原始密码吗?

简答你不能
中等答案即使可以,也不应该

长答案 :
Hash 是一条单向道路,您无法取回散列的输入。 (我不会提到蛮力)

除此之外,您 不应该 向您的用户显示旧密码,无论如何,即使是为了 "forgot password"。这是一个主要的安全漏洞。 如果用户想要change/reset/edit他们的密码,只需让他们拥有密码并将其存储在数据库中而不用担心旧密码。

还有一个重要提示:请使用 password_hash() 来散列您的密码 md5 不是为密码设计的,因为它有冲突和其他严重问题。

MD5 根据其定义是一种单向散列算法。你可以暴力攻击它(这是已知的工作)。但是对于网站和预填密码框正确的值,没有可行的解决方案。

我的猜测是您希望避免用户一直输入 hist 密码。或者确保在您提交表单时密码不会被更改。

选项是:

  • 将密码字段留空 - 如果提交表单是为了更改个人资料,请检查是否有空字段并保持密码不变。
  • 不要显示密码字段,除非您真的想进行需要再次输入密码的交易,然后让用户输入密码。其他任何事情都是对安全的破坏。

这里我有一个解决方案,我已经在我的应用程序中实现了一个解决方案,即通过使用任何哈希算法(如附加并保存在数据库中)来添加一个仅将密码转换为加密格式的列。

第一列用于原始密码,第二列用于编辑操作。

default_column: 密码

第二列:encrypt_password

public 静态函数 decrypt($string){

    $output = false;
    $encrypt_method = "AES-256-CBC";
    $secret_key =  'hafizGAmirGWasimG';
    $secret_iv = '@@_hJ%5Xkm48HU7eWem&gbPRm+=qs8bw';
    $key = hash('sha256', $secret_key);
    $iv = substr(hash('sha256', $secret_iv), 0, 16);
    $output = openssl_decrypt(base64_decode($string), $encrypt_method, $key, 0, $iv);
    return $output;

}

public static function encrypt($string){
    $output = false;
    $encrypt_method = "AES-256-CBC";
    $secret_key = 'hafizGAmirGWasimG';
    $secret_iv = '@@_hJ%5Xkm48HU7eWem&gbPRm+=qs8bw';
    $key = hash('sha256', $secret_key);
    $iv = substr(hash('sha256', $secret_iv), 0, 16);
    $output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv);
    return base64_encode($output);
}

然后当你需要更新密码时 select 即 encrypt_password 然后通过该函数解密并更新然后使用该加密方法存储以及在原始密码字段中更新md5 方法.

另外,最好的方法是不要在编辑时在密码中显示密码,如果你想更新就输入密码,如果不想更新,就把它们留空,然后做一个if else来更新或没有。

if($request->password) 那么 否则不更新。