【问题标题】:Encrypt/Decrypt string with salt using php7 [closed]使用 php7 用盐加密/解密字符串 [关闭]
【发布时间】:2018-06-08 14:07:21
【问题描述】:

我有一个字符串,我想将该字符串安全地存储在数据库中。

所以,我想到的是使用用户密码作为加密密钥来加密这个字符串。

当用户需要使用该字符串时,我们使用该密钥对其进行解密。

是否有某种算法可以帮助将这些字符串安全地存储在数据库中,防止任何人甚至团队访问它?

【问题讨论】:

  • 查看屏幕右侧的“相关”下方。
  • 自 php7 以来,许多功能已被弃用,几乎所有问题都发生在 5-8 年前。
  • 盐用于将已知值添加到散列项,以防止在匹配散列时使用彩虹表。您可能的意思是要将用户密码用作加密密钥。

标签: php encryption php-7 salt password-hash


【解决方案1】:

您想使用某种类型的共享秘密加密算法,例如 AES。 openssl 和 mcrypt 都应该支持这一点。我会推荐 openssl,因为 mcrypt 已停产。

以下示例直接来自 php.net。您可能不需要 hmac,因为您想检索原始数据。

<?php
//$key previously generated safely, ie: openssl_random_pseudo_bytes
$plaintext = "message to be encrypted";
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt($plaintext, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
//$hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
$ciphertext = base64_encode( $iv./*$hmac.*/$ciphertext_raw );

//decrypt later....
$c = base64_decode($ciphertext);
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = substr($c, 0, $ivlen);
//$hmac = substr($c, $ivlen, $sha2len=32);
$ciphertext_raw = substr($c, $ivlen/*+$sha2len*/);
$original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
/*
$calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
if (hash_equals($hmac, $calcmac))//PHP 5.6+ timing attack safe comparison
{
    echo $original_plaintext."\n";
}
*/

【讨论】:

  • 我已经在使用这些,但想知道它对敏感数据是否安全。
  • 它与使用的加密算法一样安全。该算法是否足够好取决于您的要求。您应该与 NIST 核对有关密钥长度/块大小等的建议。只要用户是唯一可以解密数据的人,并且您的用户密码使用 @summerSu 建议进行哈希处理,它应该足够安全,除了暴力破解注意事项.
  • 如果我们在直接将其用作密钥之前加密用户密码(因为我们将其用作加密密钥),例如 md5 用户密码,所以如果用户密码很弱,我们会避免任何类型的蛮力
  • 您如何看待使用 aes-256-cbc 作为密码而不是 AES-128-CBC 和 sha512 而不是 256
  • 使用较大的块大小(如 256 或 512)将是有益的。您不应该使用散列密钥。您的密码应该使用 password_hash 和至少 bcrypt 进行散列。不要使用你自己的哈希方法......我在这些“自定义实现”中看到了无数的错误。只要密码经过哈希处理,就会提示用户输入密码验证它,然后使用内存中的纯文本密码解密数据。每次用户需要检索数据时,您都需要他们输入密码。
猜你喜欢
  • 2023-01-12
  • 2017-09-09
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多