Laravel 5 加密 - 给定相同字符串的不同值?

Laravel 5 Encryption - Different values for same string given?

我正在使用 Laravel 5,并且对于一个项目,其中一位租户要求系统中存储的电子邮件必须加密。我正在使用 Laravel 5 的 Crypt:: 外观,以及相关的 encrypt()decrypt() 方法。

问题在于即使给定相同的字符串,加密值似乎也不同。起初我认为这可能与 VARCHAR 字段最大长度有关,但是两个哈希值都低于字段上设置的 255 长度。

以这个转储为例;

PHP

    $hash1 = 'eyJpdiI6InJFNTFkdktpVU9cL1wvRTJPVk94SURiUT09IiwidmFsdWUiOiJIZVh4Y1NyUGpVcTVFVTNSbWdUNnJCUWRHSGZTcnFTQWJKa1h0Q1wvMEVtZnFuM3dDeFwvXC9hdUs4enFXXC94dEJ0cSIsIm1hYyI6IjFjNjZjODFjMjI5NTQ0NmVhZDUwODQzODE0OTQ4NTdjMzAxNTQ5Y2ZjY2M4YzRiODU0ZjIwNDhmMDA0Yjc4OWQifQ';
    $hash2 = 'eyJpdiI6ImRBVWNKVTlJZVFmckk2T0c4cXNObFE9PSIsInZhbHVlIjoidElqcE5TMUFwVHZXeW12R3hKMFVFWlR0WmgxOFRBbW5cL2V3dUJ6VndsdktLYjVGR2JQQWpSUUNUWDBJbU5OQWEiLCJtYWMiOiI3MjM3ODNiMzc0NDJlNDVhYzFkOTBmMjhhOTk0MTUyM2FlNzM5ZGE4ODE3MTJlMDM5NWZiMzViZjM5OTA0MGRhIn0=';
    $dump = [
    'hash1' => $hash1,
    'hash2' => $hash2,
    'string1' => Crypt::decrypt($hash1),
    'string2' => Crypt::decrypt($hash2)
    ];
    return $dump;

转储对象

hash1: "eyJpdiI6InJFNTFkdktpVU9cL1wvRTJPVk94SURiUT09IiwidmFsdWUiOiJIZVh4Y1NyUGpVcTVFVTNSbWdUNnJCUWRHSGZTcnFTQWJKa1h0Q1wvMEVtZnFuM3dDeFwvXC9hdUs4enFXXC94dEJ0cSIsIm1hYyI6IjFjNjZjODFjMjI5NTQ0NmVhZDUwODQzODE0OTQ4NTdjMzAxNTQ5Y2ZjY2M4YzRiODU0ZjIwNDhmMDA0Yjc4OWQifQ"
hash2: "eyJpdiI6ImRBVWNKVTlJZVFmckk2T0c4cXNObFE9PSIsInZhbHVlIjoidElqcE5TMUFwVHZXeW12R3hKMFVFWlR0WmgxOFRBbW5cL2V3dUJ6VndsdktLYjVGR2JQQWpSUUNUWDBJbU5OQWEiLCJtYWMiOiI3MjM3ODNiMzc0NDJlNDVhYzFkOTBmMjhhOTk0MTUyM2FlNzM5ZGE4ODE3MTJlMDM5NWZiMzViZjM5OTA0MGRhIn0="
string1: "admin03@y..sef...iman.com"
string2: "admin03@y..sef...iman.com"

出于隐私考虑,输入的是点而不是字符,但它们完全相同。我唯一能想到的另一件事可能是某种字符集格式?

如果能帮助解决这个问题,我们将不胜感激!

此致。

如果我理解你的问题,那就是为什么即使输入相同、密钥相同,加密结果也会不同?

(你提到这些是散列,但 Crypt::encrypt() 和 decrypt() 用于对称加密)

Laravel Crypt uses CBC mode by default。这意味着它会在您每次加密某些内容时生成一个随机 IV,以确保输出始终不同。

如果不使用像 CBC 这样的模式,您就有泄露信息的风险。如果我知道 admin03@y..sef...iman.com 总是加密为 eyJpdiI6InJFNTFkdktpVU9cL1wvRTJPVk94SURiUT09IiwidmFsdWUiOiJIZVh4Y1NyUGpVcTVFVTNSbWdUNnJCUWRHSGZTcnFTQWJKa1h0Q1wvMEVtZnFuM3dDeFwvXC9hdUs4enFXXC94dEJ0cSIsIm1hYyI6IjFjNjZjODFjMjI5NTQ0NmVhZDUwODQzODE0OTQ4NTdjMzAxNTQ5Y2ZjY2M4YzRiODU0ZjIwNDhmMDA0Yjc4OWQifQ,那么即使不知道您的加密密钥,我仍然会 知道一些 关于您的消息(它被发送给谁,例如)。

您可以看到一个很好的风险示例 here

编辑:如果这是用于密码存储,则不应使用 encrypt() 和 decrypt()。你应该使用 bcrypt() 或 PBKDF2。否则,假设妥协,攻击者可以解密您的所有用户密码。