PHP字符串加密/解密,我做错了吗?

PHP字符串加密/解密,我做错了吗?,php,mysql,encryption,web-hosting,blowfish,Php,Mysql,Encryption,Web Hosting,Blowfish,嘿,我真的需要一些指导 自动取款机。我对常规字符串使用这种加密/解密方法 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, "!@#

嘿,我真的需要一些指导

自动取款机。我对常规字符串使用这种加密/解密方法

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数据库中

我没有权限在Web服务器上安装定制的php插件。那么有没有其他安全的方法可以做到这一点

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

这不用于密码等

但经过一些研究,这可能不是最安全的方法

您不知何故成功地实现了不安全代码的神圣三位一体:

  • 库:使用一个有很多bug的废弃库(mcrypt)。可以使用OpenSSL,但安全地使用它仍然是一个挑战。这是一个更好的选择

  • 分组密码:使用河豚,即使它的创建者说它是不安全的。AES(=Rijndael-128)是一个更好的选择,但在使用好的库时,您不必担心这一点(参见1)

  • 分组密码操作模式:使用ECB模式几乎在所有情况下都是不安全的()。一般来说,需要像CBC这样的随机模式,但在使用一个好的库时,您不必担心这一点(参见1)

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

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

    键通常是简单的字节数组。有些密码(如DES)有弱密钥,您需要检查并生成另一个密钥。一个好的库通常会为您提供一个用于生成密钥的API

    存储密钥是一个争论不休的问题。考虑一下加密某些数据的有用性,其中密钥存储在加密数据附近。毕竟,您通常需要经常访问和解密这些数据。这方面没有好的解决办法。如果您将加密密钥存储在另一台计算机上而不是数据上,则发生其他错误并使网络易受攻击的可能性更高

    但经过一些研究,这可能不是最安全的方法

    您不知何故成功地实现了不安全代码的神圣三位一体:

  • 库:使用一个有很多bug的废弃库(mcrypt)。可以使用OpenSSL,但安全地使用它仍然是一个挑战。这是一个更好的选择

  • 分组密码:使用河豚,即使它的创建者说它是不安全的。AES(=Rijndael-128)是一个更好的选择,但在使用好的库时,您不必担心这一点(参见1)

  • 分组密码操作模式:使用ECB模式几乎在所有情况下都是不安全的()。一般来说,需要像CBC这样的随机模式,但在使用一个好的库时,您不必担心这一点(参见1)

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

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

    键通常是简单的字节数组。有些密码(如DES)有弱密钥,您需要检查并生成另一个密钥。一个好的库通常会为您提供一个用于生成密钥的API


    存储密钥是一个争论不休的问题。考虑一下加密某些数据的有用性,其中密钥存储在加密数据附近。毕竟,您通常需要经常访问和解密这些数据。这方面没有好的解决办法。如果将加密密钥存储在数据以外的另一台计算机上,更高的可能性是您出现其他错误并使您的网络易受攻击。

    问题不清楚,因为您没有解释为什么需要以加密方式存储数据,以及为什么您认为上述方法不够安全。ECB实际上没有使用初始化向量(算法不会对每个块产生扰动)。至少使用CBC。否则,这基本上只是一个预共享密钥——充其量只是轻微安全的,对存储在磁盘上的不太敏感的内容进行加扰也可以。没有什么东西是真正安全的,但是使用bcrypt来派生密钥和使用AES-256-CBC之类的东西会更好一些。您不应该加密和解密密码,而应该将密码散列并将散列后的密码存储在数据库中,当用户输入密码时,以同样的方式散列密码,并用数据库的散列密码检查用户的散列密码。我认为您最好尽可能保护您的服务器和应用程序。@Tschallacka您可能是对的:)问题不清楚,因为您没有解释为什么需要以加密方式存储数据以及为什么您相信上面的方法不够安全。ECB实际上没有使用初始化向量(算法不会对每个块产生扰动)。至少使用CBC。否则,这基本上只是一个预共享密钥——充其量只是轻微安全的,对存储在磁盘上的不太敏感的内容进行加扰也可以。没有什么东西是真正安全的,但是使用bcrypt来派生密钥和使用AES-256-CBC之类的东西会更好一些。您不应该加密和解密密码,而应该将密码散列并将散列后的密码存储在数据库中,当用户输入密码时,以同样的方式散列密码,并用数据库的散列密码检查用户的散列密码。我认为您最好尽可能保护您的服务器和应用程序。@Tschallacka您可能是对的:)