저는 암호화 초보자이지만 데이터베이스에 저장하기 전에 민감한 개인 데이터를 암호화해야합니다. CBC와 함께 AES를 사용할 계획 이었지만 소금도 사용하고 싶었습니다. 그러나 나는 (BouncyCastle을 사용하는 것 이외에 다른 이유로 허용 할 준비가되지 않은 BouncyCastle 이외의) 이것을 할 수있는 방법을 찾지 못했습니다. 따라서 임의의 문자열을 암호화 할 텍스트 끝에 추가하여 하나를 추가하기로했습니다.AES로 소금 내기
- 내 암호화의 염을 포함하는 더 나은 방법이 있나요 :
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 개 질문이 됐을까?
- 이 예제와 비슷한 예에서 항상 처음에 임의의 키 이 생성되고 암호화가 인 직후에 해독이 수행 된 것으로 보입니다. 이것은 희박한 시나리오입니다 - 그래서 기반에서 매번 같은 키를 사용해야합니다 ( 처럼 보이지만 모든 예제는 무작위로 보입니다). 다른 방법은 작동하지만 다른 사람이 확인할 수있는 방법은 확인할 수 있습니다.
- 고정 키로 작업하면 문자열을 암호화하면 계속 나타납니다. 다른 결과를 얻지 만 끝 만납니다. 암호화 된 결과의 일부가 변경됩니다. 보이지 않는다. 어째서?
많은 감사, 닐
내 대답은 [here] (http://stackoverflow.com/a/8828196/589259) 도움이 될까요? –
주류 암호화 목적으로 탄력이 필요하지 않습니다. Oracle JCA의 기능으로 충분합니다. 추가 Bouncy 기능이 필요하다면 애플리케이션으로 간단한 API를 컴파일 할 수 있습니다. Bouncy 공급자를 설치하면 작동하지 않을 수도 있습니다. –
감사합니다. 256 비트 및 표준 JCA를 사용하여 소금 제거를 완료했습니다. –