2013-04-23 3 views
0

저는 암호화 초보자이지만 데이터베이스에 저장하기 전에 민감한 개인 데이터를 암호화해야합니다. CBC와 함께 AES를 사용할 계획 이었지만 소금도 사용하고 싶었습니다. 그러나 나는 (BouncyCastle을 사용하는 것 이외에 다른 이유로 허용 할 준비가되지 않은 BouncyCastle 이외의) 이것을 할 수있는 방법을 찾지 못했습니다. 따라서 임의의 문자열을 암호화 할 텍스트 끝에 추가하여 하나를 추가하기로했습니다.AES로 소금 내기

  1. 내 암호화의 염을 포함하는 더 나은 방법이 있나요 :
    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); 
    byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 
    IvParameterSpec ivspec = new IvParameterSpec(iv); 
    
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
    
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivspec); 
    
    String plainText = "This is my plain text"; 
    System.out.println("**plainText: " + plainText); 
    
    String saltedPlainText = plainText + UUID.randomUUID().toString().substring(0, 8); 
    byte[] encrypted = cipher.doFinal(saltedPlainText.getBytes()); 
    String encryptedText = new String(new Hex().encode(encrypted)); 
    System.out.println("**encryptedText: " + encryptedText); 
    
    cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivspec); 
    
    byte[] decrypted = cipher.doFinal(new Hex().decode(encryptedText.getBytes())); 
    saltedPlainText = new String(decrypted); 
    plainText = saltedPlainText.substring(0, saltedPlainText.length()-8); 
    
    System.out.println("**plainText: " + plainText); 
    

    은 내가 3 개 질문이 됐을까?

  2. 이 예제와 비슷한 예에서 항상 처음에 임의의 키 이 생성되고 암호화가 인 직후에 해독이 수행 된 것으로 보입니다. 이것은 희박한 시나리오입니다 - 그래서 기반에서 매번 같은 키를 사용해야합니다 ( 처럼 보이지만 모든 예제는 무작위로 보입니다). 다른 방법은 작동하지만 다른 사람이 확인할 수있는 방법은 확인할 수 있습니다.
  3. 고정 키로 작업하면 문자열을 암호화하면 계속 나타납니다. 다른 결과를 얻지 만 끝 만납니다. 암호화 된 결과의 일부가 변경됩니다. 보이지 않는다. 어째서?

많은 감사, 닐

+0

내 대답은 [here] (http://stackoverflow.com/a/8828196/589259) 도움이 될까요? –

+0

주류 암호화 목적으로 탄력이 필요하지 않습니다. Oracle JCA의 기능으로 충분합니다. 추가 Bouncy 기능이 필요하다면 애플리케이션으로 간단한 API를 컴파일 할 수 있습니다. Bouncy 공급자를 설치하면 작동하지 않을 수도 있습니다. –

+0

감사합니다. 256 비트 및 표준 JCA를 사용하여 소금 제거를 완료했습니다. –

답변

3

소금에 절인는 일반적으로 일반 텍스트를 암호화 할 때, 암호를 해싱 할 때 이루어집니다 무언가이다; 예를 들어 PBEKeySpec을 사용하여 암호에서 키를 생성 할 때 소금을 사용합니다. AES의 "salt"는 초기화 벡터입니다.

매번 같은 초기화 벡터를 사용하기 때문에 동일한 일반 텍스트를 암호화 할 때 동일한 암호문을 얻게됩니다. 예를 들어 SecureRandom을 사용하여 IV를 무작위로 지정해야합니다. 그렇지 않으면 카운터에서 IV를 생성해야합니다. IV는 비밀이 아니며 (일반 텍스트로 전송 될 수 있음), 암호 해독기는 암호화 장치와 동일한 IV를 사용해야합니다.

1

왜 텍스트에 소금을 추가하고 있습니까? 그것은 아무 것도하지 않을 것입니다.

소금은 일반적으로 레인보우 테이블을 무효화하기 위해 암호를 해시하는 데 사용됩니다. 다음과 같이 작동합니다. 사용자가 암호 "qwerty"를 입력한다고합니다. 16 바이트 길이의 임의의 문자열 (rs)을 생성하고 암호에 추가 한 다음 결과 문자열을 해시 한 다음 해시를 가져 와서 rs를 추가하고 결과 문자열을 데이터베이스에 저장합니다.

+0

이제 알았습니다. 귀하의 답변을 주셔서 감사합니다 :) –

+0

대략적으로 루프를 만들 수있는 숫자는 일반적으로 구성 가능하며 좋은 PBKDF는 일반적으로 해시가 아닌 MAC에 가까운 것을 사용해야합니다. –

+0

그 점 좀 자세히 설명해 주시겠습니까? PBKDF에 대해 조금 읽었지만 MAC과 무슨 상관이 있습니까? – Evgeni