2012-03-13 7 views
2

올바른 암호로 작업중인 문자열의 암호를 해독하고 싶습니다. 나는 if(decrypt(Password, encryptedKey).contains(Key)){과 암호를 확인하려하지만 PW가 잘못되면 나는 다음과 같은 예외를 얻을 :암호 해독 전에 암호 확인

javax.crypto.BadPaddingException: pad block corrupted 

그래서 암호를 확인하는 또 다른 방법은 무엇입니까?

public static String decrypt(String seed, String encrypted) throws Exception { 
    byte[] rawKey = getRawKey(seed.getBytes()); 
    byte[] enc = toByte(encrypted); 

    SecretKeySpec Spec = new SecretKeySpec(rawKey, "AES"); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.DECRYPT_MODE, Spec); 


    byte[] result = cipher.doFinal(enc); 

    return new String(result); 
} 
+1

잘못된 암호를 사용하여 암호를 해독하지 않고 예외를 throw하지 않지만 올바른 암호를 사용하여 암호를 해독하는 경우 문제가 생깁니 까? 실제로 암호를 해독하는 것보다 암호를 확인하는 "쉬운"방법은 없습니다 (또는 * 적어도 * 사용하지 않아야 함). – Piskvor

+0

당신은 시도하고 잡을 사용해야한다는 뜻 ?? – Droider

답변

2

잘못된 암호를 사용하여 암호를 해독하지 않고 예외를 throw하지만 올바른 암호를 사용하여 암호를 해독하는 경우 문제? 실제로는 암호를 해독하는 것보다 암호를 확인하는 쉬운 방법이 없습니다 (또는 이 아니어야합니다) : 바로 가기가 존재하면 공격자가 타겟팅 할 수있는 약한 지점을 제공합니다 ("왜 각 암호를 시도 할 때 현관 문 아래에 암호 힌트가 있습니까? ").

예외없이 암호를 해독하면 암호가 정확합니다. 예외가 발생하면 암호가 올바르지 않습니다.

이것은 "예외적 인 상태에서만 예외 사용"처럼 스타일 상으로는 좋지 않을 수 있지만 데이터와 함께 비밀번호를 저장하는 것과 같은 시스템 보안을 저하시키지는 않습니다. 저장 전에 비밀번호를 해시하면 이 약간 도움이됩니다.이지만 잘못 이해하기 쉽고 보안을 유지하면서 시스템의 복잡성을 증가시킵니다 (예 : this).

+0

좋습니다. – Droider

+2

이 예외는 잘못된 암호의 신뢰할 수있는 표시가 아닙니다. 바꿔 말하면 잘못된 암호는 여전히 유효한 패드 블록을 무작위로 생성 할 수 있습니다. 특히 패딩 값이 1 또는 2 바이트 인 경우 더욱 그렇습니다. –

+0

@GregS : 공정한 포인트. OP는 아마도 암호 해독 된 출력이 의미있는 것인지 확인해야합니다. - 잘못된 암호로 IIRC 암호 해독 (패딩을 손상시키지 않더라도)은 쓰레기를 제공해야합니다. – Piskvor

2

이렇게하면 프로그램이 암호를 입력 된 암호와 비교하기 위해 암호를 어딘가에 저장해야합니다. 해커를위한 백도어를 만들고 싶지 않으면 저장 한 암호를 해시해야합니다. (입력 된 암호도 해시되고 저장된 암호와 비교됩니다.)

+0

좋습니다. 고마워요. 이 문자열은 파일의 한 줄이므로 MD5 암호화로 암호화 된 파일에 암호를 저장합니다. – Droider

+0

암호 해시를 저장하지 않으려면 시스템을 약화시켜야합니다. 이제 공격자는 해시를 먼저 끊을 필요가 있습니다. 해독보다 잠재적으로 쉬울 수 있습니다. –

+0

@ RomanPlášil 일반 텍스트 비밀번호를 저장하는 것과 반대가됩니까? – Andreas