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?
您以某种方式设法达到了不安全代码的三位一体:
库:使用一个废弃的库(mcrypt),有很多错误。可以使用 OpenSSL,但安全地使用它仍然是一个挑战。 defuse/php-encryption 是一个更好的选择。
块密码:使用 Blowfish,甚至其创建者都说它不安全。 AES (=Rijndael-128) 是一个更好的选择,但在使用一个好的库时,这不是您应该担心的事情(参见 1)。
块密码操作模式:使用 ECB 模式几乎在所有情况下都是不安全的 (scroll down to the penguin)。通常,需要像 CBC 这样的随机模式,但在使用一个好的库时,这不是你应该担心的事情(见 1)。
这适用于数据(以及一些)的安全传输。如果您需要根据加密列在数据库中查找内容,那么您需要考虑添加哈希列或真正使用 ECB 模式。
And how should I generate / store my encryption key?
键通常是简单的字节数组。某些密码(如 DES)具有弱密钥,您需要检查这些密钥并生成另一个密钥。一个好的库通常会给你一个 API 来生成密钥。
存储密钥是一个备受争议的问题。想想加密一些数据的用处,其中密钥存储在靠近加密数据的地方。毕竟,您通常需要经常访问和解密该数据。对此没有好的解决方案。如果您将加密密钥存储在另一台机器上而不是数据上,则出现其他错误并使您的网络容易受到攻击的可能性更高。
嘿,我真的需要一些指导。
自动取款机。我正在对常规字符串使用这种 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?
您以某种方式设法达到了不安全代码的三位一体:
库:使用一个废弃的库(mcrypt),有很多错误。可以使用 OpenSSL,但安全地使用它仍然是一个挑战。 defuse/php-encryption 是一个更好的选择。
块密码:使用 Blowfish,甚至其创建者都说它不安全。 AES (=Rijndael-128) 是一个更好的选择,但在使用一个好的库时,这不是您应该担心的事情(参见 1)。
块密码操作模式:使用 ECB 模式几乎在所有情况下都是不安全的 (scroll down to the penguin)。通常,需要像 CBC 这样的随机模式,但在使用一个好的库时,这不是你应该担心的事情(见 1)。
这适用于数据(以及一些)的安全传输。如果您需要根据加密列在数据库中查找内容,那么您需要考虑添加哈希列或真正使用 ECB 模式。
And how should I generate / store my encryption key?
键通常是简单的字节数组。某些密码(如 DES)具有弱密钥,您需要检查这些密钥并生成另一个密钥。一个好的库通常会给你一个 API 来生成密钥。
存储密钥是一个备受争议的问题。想想加密一些数据的用处,其中密钥存储在靠近加密数据的地方。毕竟,您通常需要经常访问和解密该数据。对此没有好的解决方案。如果您将加密密钥存储在另一台机器上而不是数据上,则出现其他错误并使您的网络容易受到攻击的可能性更高。