2014-12-04 1 views
0

비밀번호와 같은 민감한 정보를 String 형식으로 전달했습니다. 나중에 암호가 힙 메모리 덤프에서 텍스트 형식으로 저장 됨으로 쉽게 읽을 수 있음을 알게되었습니다. 문자 배열 Vs 사용할 바이트 배열?

String password = "super_password"; 

그래서 나는

Char[] passChar = password.toCharArray(); 

, 문자 배열을 사용하기로 결정하지만 암호가 여전히 문자로 메모리 덤프 문자에서 읽을 수 있는지 걱정입니다. 그럼 대신 바이트 배열을 사용하여 생각.

byte[] passByte = password.getBytes(); 

내 질문 : 암호와 같은 중요한 정보를 전달하기 위해 바이트 배열을 사용하는 것이 안전합니까? 또는 누구든지 보안을 권할만한 사람이 있습니까?

+1

char로 char을 읽을 수 있다면 바이트를 바이트 단위로 읽고 수동으로 다시 변환하는 것을 중단해야 할 대상은 무엇입니까? – Pokechu22

+0

@ Pokechu22 나는 그가 [this] (http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords)를 참조하고 있다고 생각한다. – August

답변

0

문자는 문자의 멀티 바이트 표현이므로 메모리 덤프는 거의 동일한 결과를 제공합니다. 당신은 스토리지에 대한 암호를 암호화해야합니다 :이 stackoverflow 답변에서와 같이 : Encrypt Password in Configuration Files? (Java)

1

MD5 또는 다른 암호화로 암호를 암호화 할 수 있습니다.

package test.md5; 

import java.security.MessageDigest; 

public class MD5Util { 
    public final static String MD5(String s) { 
     char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};  

     try { 
      byte[] btInput = s.getBytes(); 
      // get MD5 MessageDigest obj 
      MessageDigest mdInst = MessageDigest.getInstance("MD5"); 
      // update 
      mdInst.update(btInput); 
      // get encryption string 
      byte[] md = mdInst.digest(); 
      // change to hexadecimal 
      int j = md.length; 
      char str[] = new char[j * 2]; 
      int k = 0; 
      for (int i = 0; i < j; i++) { 
       byte byte0 = md[i]; 
       str[k++] = hexDigits[byte0 >>> 4 & 0xf]; 
       str[k++] = hexDigits[byte0 & 0xf]; 
      } 
      return new String(str); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    public static void main(String[] args) { 
     System.out.println(MD5Util.MD5("20121221")); 
     System.out.println(MD5Util.MD5("encrypt")); 
    } 
} 
+1

md5는 암호화되지 않습니다. – Khanna111

+0

내 영어가 좋지 않음 ~~ 미안. – TraXD

0

하면 이런 문제는 주로 다른 호스트에서 다른 프로세스에 하나 개 이상의 호스트 프로세스에서 암호 전달에 관한 것으로 가정하고 있지만, 물론, 특정 변수에 암호 판독 다룰 것이다.

할당 문제는 this과 같은 다른 SF 응답에 설명 된 문제가있는 String 인스턴스에 암호를 할당하는 것만으로 국한되지 않습니다. 전역 컨텍스트가 아니라 메서드 컨텍스트에서 char 또는 바이트 배열을 사용하여 메서드가 종료 된 후 범위 밖으로 빠져 나가 GC에 사용할 수있게 만드는 경우를 추가합니다. 변수가 젊은 세대에 있다면, 일단 범위를 벗어나면 변수를 지우기 위해 여러 GC 사이클이 필요할 것입니다. 플러스 char/byte []는 변경 가능하므로 삭제 될 수 있습니다. 그러나이 시간과 일치하는 힙 덤프에서 암호를 복구 할 수있는 기회는 여전히 있습니다. 한마디로

:

  1. 은 백엔드에서 일반 텍스트 암호를 유지하지 마십시오. [해싱을 소금으로 사용하십시오. here.
  2. 비보안 매체의 일반 텍스트로 암호를 전송하지 마십시오. [호스트 간의 TLS 사용]
+0

덕분에이 정보가 도움이되었습니다. –

+0

@Lucky_Singh :이 정보가 도움이된다면, 수락 및/또는 upvoting하여 명성을 높이는 데 도움이됩니다. – Khanna111

1

Java의 암호 지향 API는 char[]입니다. 예를 들어 ConsoleJPasswordField은 비밀번호 입력에서 문자 배열을 반환하고 PBEKeyKeyStore은 비밀번호 기반 암호화에 char[]이 필요합니다.

byte[]char[] 사이의 변환은 힙에 중요한 데이터의 복사본을 더 많이 생성하므로 문자 인코더가 모든 내부 데이터 버퍼에서 암호 데이터를 지워야합니다.

암호를 저장하는 데 char[]을 사용하고 암호가 더 이상 필요하지 않으면 write '\0' to the array을 사용하십시오.

+0

감사 메이트, 사용 후 char 배열을 재정의합니다. –