>

코드가 약한 지 알고 싶습니다. 누구든지 내 코드에서 실수를 발견 할 수 있습니까?

암호화

public static String byte2hex(byte[] b) {
    //we know exactly how long the resulting string should be so pass that information along to minimize allocations
    StringBuilder hs = new StringBuilder(b.length*2);
    for (int n = 0; n < b.length; n++) {
        String stmp = Integer.toHexString(b[n] & 0xFF);
        if (stmp.length() == 1)
            hs.append("0").append(stmp);
        else
            hs.append(stmp);
    }
    return hs.toString().toUpperCase();
}


public static byte[] encryptMsg(String secretKeyString, String msgContentString)  {
    try {
        byte[] returnArray;
        //generate AES secret key from users input
        Key key = generateKey(secretKeyString);
        //specify the cipher algorithm using AES
        Cipher c = Cipher.getInstance("AES");
        // specify the encryption mode
        c.init(Cipher.ENCRYPT_MODE, key);
        // encrypt
        returnArray = c.doFinal(msgContentString.getBytes());
        return returnArray;
    }
    catch (Exception e)
    {
        e.printStackTrace();
        byte[] returnArray = null;
        return returnArray;
    }
}
private static Key generateKey(String secretKeyString) throws Exception {
    // generate secret key from string
    Key key = new SecretKeySpec(secretKeyString.getBytes(), "AES");
    return key;
}

해독

public static byte[] hex2byte(byte[] b) {
    if ((b.length % 2) != 0)
        throw new IllegalArgumentException("hello");
    byte[] b2 = new byte[b.length / 2];
    for (int n = 0; n < b.length; n += 2) {
        String item = new String(b, n, 2);
        b2[n / 2] = (byte) Integer.parseInt(item, 16);
    }
    return b2;
}
public static byte[] decryptMsg(String secretKeyString, byte[] encryptedMsg)
        throws Exception {
    // generate AES secret key from the user input secret key
    Key key = generateKey(secretKeyString);
    // get the cipher algorithm for AES
    Cipher c = Cipher.getInstance("AES");
    // specify the decryption mode
    c.init(Cipher.DECRYPT_MODE, key);
    // decrypt the message
    byte[] decValue = c.doFinal(encryptedMsg);
    return decValue;
}
private static Key generateKey(String secretKeyString) throws Exception {
    // generate AES secret key from a String
    Key key = new SecretKeySpec(secretKeyString.getBytes(), "AES");
    return key;
}

  • 답변 # 1

    이 방법으로 AES를 사용하는 것은 약하지만 CodeReview의 주제는 아닙니다. 이를 위해 Security.SE로 향하십시오. Java Crypto API는 기본적으로 키 크기에 대한 제한이 매우 제한적입니다 (특별 정책 파일 없이는 AES-256이 발생하지 않음). 또 다른 문제는 암호를 직접 키 자료로 사용하고 (키 파생 알고리즘 없음) 사용자 정의 IV를 설정하지 않는다는 것입니다. 보안 관점에서 볼 때 이것은 가짜입니다.

    Java 관점에서 볼 때 몇 가지 문제가 있습니다

    <올>

    왜 와이즈 비즈를 던지니  메시지 IllegalArgumentException 와 함께 ? "hello" 와 같은 훨씬 더 설명적인 메시지를 찾으십시오.

    문자열 길이에 대해서는 일관성 검사를 수행하고 있지만 컨텍스트는 아닙니다. 대신 다음 RegEx가 암호문과 일치하는지 확인해야합니다.

    "The encoded Ciphertext must have an even number of hexadecimal characters."
    
    

    이 패턴은 일정하기 때문에 실제로는 String ciphertext = new String(b); Pattern validator = Pattern.compile("^(?:[0-9A-Fa-f]{2})+$"); if (!validator.matches(ciphertext)) { throw new IllegalArgumentException("The encoded Ciphertext must have an even number of hexadecimal characters."); } 로 만들어야합니다  메소드가 아닌 클래스에 넣습니다.

    private static final 를 받아들이나요   byte[] 에 대한 입력으로  당신이 hex2bytes 를 만드는 경우 일상  그것에서 파싱? 이 방법으로 사용자는 String 의 인코딩을 제어 할 수 없습니다 .

    건조. 중복 메소드 String 가 있습니다 . 변경하고 싶다면 두 곳에서 발생하거나 프로그램이 중단됩니다. 대신, 암호화와 암호 해독을 하나의 클래스에 넣고 하나의 메소드 만 유지하십시오.   generateKey 를 파생시키기 위해  사용자가 지정한 비밀번호 문구

    제작 환경 또는 장난 이외의 용도로 암호화를 사용하려면 완성 된 타사 보안 라이브러리를 사용하십시오. 잘못 될 수있는 것이 너무 많아서 Cryptosystem을 쓸모 없거나 공격하기 쉽습니다.

    generateKey

관련 자료

  • 이전 php - 오늘로부터 15 일 미만의 가입 날짜가있는 행을 검색합니다
  • 다음 c - 특정 숫자로 숫자 계산