我使用的是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"
输入点代替字符以保护隐私,但它们完全相同。我可能想到的另一件事可能是某种字符集格式化?
任何帮助解决这个问题都将非常感谢!
问候。
答案 0 :(得分:4)
如果我理解你的问题,那么即使使用相同的输入和相同的密钥,加密结果也会有所不同?
(你提到这些是哈希,但Crypt :: encrypt()和decrypt()是用于对称加密)
Laravel Crypt uses CBC mode by default。这意味着它会在每次加密时生成随机IV,以确保输出始终不同。
如果不使用像CBC这样的模式,您就有泄露信息的风险。如果我知道admin03@y..sef...iman.com
始终加密到eyJpdiI6InJFNTFkdktpVU9cL1wvRTJPVk94SURiUT09IiwidmFsdWUiOiJIZVh4Y1NyUGpVcTVFVTNSbWdUNnJCUWRHSGZTcnFTQWJKa1h0Q1wvMEVtZnFuM3dDeFwvXC9hdUs4enFXXC94dEJ0cSIsIm1hYyI6IjFjNjZjODFjMjI5NTQ0NmVhZDUwODQzODE0OTQ4NTdjMzAxNTQ5Y2ZjY2M4YzRiODU0ZjIwNDhmMDA0Yjc4OWQifQ
,那么即使不知道您的加密密钥,我仍然知道关于您的邮件的某些内容(例如,它被发送给谁) 。
您可以看到风险here的一个很好的例子。
编辑:如果这是用于密码存储,则不应使用encrypt()和decrypt()。您应该使用bcrypt()或PBKDF2。否则,假设妥协,攻击者可以解密所有用户密码。