【问题标题】:Is it safe to use following library of AES Encryption in PHP/Java?在 PHP/Java 中使用以下 AES 加密库是否安全?
【发布时间】:2015-07-07 14:59:36
【问题描述】:

当我在搜索 AES 加密/解密实现时,我在 SO 中发现了一些问题的链接,例如:

  1. AES Encryption Java -> PHP -> Java
  2. AES encryption in java
  3. AES encryption & security flaw
  4. Is it safe to use PBKDF2 with SHA256 to generate 128-bit AES keys?

我还发现了以下网页,它提供了易于使用的 PHP 和 Java 中的 AES 加密/解密算法实现,library

问题:直接在我们的实时开发项目中使用该 AES 实现库是否安全?

这可能需要您执行源代码。因此,由于 PHP 实现可能看起来更长,因此我已经放置了该库的 Java 源代码的基本部分。

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
/**
Aes encryption
*/
public class AES
{

    private static SecretKeySpec secretKey ;
    private static byte[] key ;

    private static String decryptedString;
    private static String encryptedString;

    public static void setKey(String myKey){


        MessageDigest sha = null;
        try {
            key = myKey.getBytes("UTF-8");
            System.out.println(key.length);
            sha = MessageDigest.getInstance("SHA-1");
            key = sha.digest(key);
            key = Arrays.copyOf(key, 16); // use only first 128 bit
            System.out.println(key.length);
            System.out.println(new String(key,"UTF-8"));
            secretKey = new SecretKeySpec(key, "AES");


        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



    }

    public static String getDecryptedString() {
        return decryptedString;
    }
    public static void setDecryptedString(String decryptedString) {
        AES.decryptedString = decryptedString;
    }
    public static String getEncryptedString() {
        return encryptedString;
    }
    public static void setEncryptedString(String encryptedString) {
        AES.encryptedString = encryptedString;
    }
    public static String encrypt(String strToEncrypt)
    {
        try
        {
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");

            cipher.init(Cipher.ENCRYPT_MODE, secretKey);


            setEncryptedString(Base64.encodeBase64String(cipher.doFinal(strToEncrypt.getBytes("UTF-8"))));

        }
        catch (Exception e)
        {

            System.out.println("Error while encrypting: "+e.toString());
        }
        return null;
    }
    public static String decrypt(String strToDecrypt)
    {
        try
        {
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");

            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            setDecryptedString(new String(cipher.doFinal(Base64.decodeBase64(strToDecrypt))));

        }
        catch (Exception e)
        {

            System.out.println("Error while decrypting: "+e.toString());
        }
        return null;
    }
}

注意:请不要将此标记为过于宽泛的问题并忽略它,我之所以这样问是因为我需要在将其用于下一个项目之前确定。

提前感谢您宝贵的时间!

【问题讨论】:

标签: java php security cryptography aes


【解决方案1】:

不,您绝对不应该使用该代码。

AES 类不应包含摘要,它不是 AES 的一部分。欧洲央行不安全;如果没有完整性/身份验证,即使 CBC 也可能不安全。异常在表格下被打乱,将导致null被返回。运行时异常与由无效输入和输出生成的异常之间没有区别。字段不正确。正在使用默认编码。实际上,如果我有一个计分表,那么它至少会在大约一半的分数上失败。

为了能够使用密码学,您需要至少对该主题有最低限度的了解。否则,您需要将其留给专业人员,或者您需要使用已知专家的预制解决方案。仅仅从互联网上获取代码只会给您一种错误的安全感,并且是无法修复错误的来源。

【讨论】:

  • 我在 3 分钟内输入了这个,这意味着我什至没有仔细看代码。位桶对于这段代码来说太好了。
  • 嗯,我对密码学有很好的了解。但情况是我需要知道是否存在使用某人在我们的生产级项目中制作的库而不重新发明轮子的任何漏洞。因为就像他们已经知道我的加密算法是如何工作的一样。就是这样!
  • PHP 库默认为 ECB 模式。我不会向任何人推荐这个图书馆。它无法提供合理的默认值。 Error-prone cryptography designs (PDF) 应该被劝阻。如果你需要一个安全的实现:我保证defuse/php-encryption
猜你喜欢
  • 2016-09-27
  • 2012-03-28
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
相关资源
最近更新 更多