PHP 字符串 encryption/decryption,我做错了吗?

PHP string encryption/decryption, am i doing it wrong?

嘿,我真的需要一些指导。

自动取款机。我正在对常规字符串使用这种 encryption/decryption 方法。

function encrypt($pure_string) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, "!@#$%#^&*", utf8_encode($pure_string), MCRYPT_MODE_ECB, $iv);
    return $encrypted_string;
}
function decrypt($encrypted_string) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, "!@#$%#^&*", $encrypted_string, MCRYPT_MODE_ECB, $iv);
    return $decrypted_string;
}

但经过一些研究,这可能不是最安全的方法?数据存储在 MYSQL 数据库中。

而且我无权在网络服务器上安装自定义 php 插件。那么有没有其他安全的方法来做到这一点?

我应该如何生成/存储我的加密密钥?

这不用于密码等

But after some research that might not be the most secure way?

您以某种方式设法达到了不安全代码的三位一体:

  1. 库:使用一个废弃的库(mcrypt),有很多错误。可以使用 OpenSSL,但安全地使用它仍然是一个挑战。 defuse/php-encryption 是一个更好的选择。

  2. 块密码:使用 Blowfish,甚至其创建者都说它不安全。 AES (=Rijndael-128) 是一个更好的选择,但在使用一个好的库时,这不是您应该担心的事情(参见 1)。

  3. 块密码操作模式:使用 ECB 模式几乎在所有情况下都是不安全的 (scroll down to the penguin)。通常,需要像 CBC 这样的随机模式,但在使用一个好的库时,这不是你应该担心的事情(见 1)。

这适用于数据(以及一些)的安全传输。如果您需要根据加密列在数据库中查找内容,那么您需要考虑添加哈希列或真正使用 ECB 模式。

And how should I generate / store my encryption key?

键通常是简单的字节数组。某些密码(如 DES)具有弱密钥,您需要检查这些密钥并生成另一个密钥。一个好的库通常会给你一个 API 来生成密钥。

存储密钥是一个备受争议的问题。想想加密一些数据的用处,其中密钥存储在靠近加密数据的地方。毕竟,您通常需要经常访问和解密该数据。对此没有好的解决方案。如果您将加密密钥存储在另一台机器上而不是数据上,则出现其他错误并使您的网络容易受到攻击的可能性更高。