일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 알고리즘
- 네트워크보안
- I'm Sorry
- 보안
- 버전관리
- 자료구조
- 클라우드컴퓨팅
- Yes
- 컴퓨터과학
- 자바스크립트
- 프로그래밍언어
- 소프트웨어공학
- 컴퓨터비전
- 컴퓨터공학
- 2
- 프로그래밍
- 인공지능
- 소프트웨어
- 사이버보안
- 데이터베이스
- 웹개발
- 데이터구조
- 머신러닝
- 빅데이터
- 딥러닝
- 네트워크
- 데이터분석
- 데이터과학
- 코딩
- 파이썬
- Today
- Total
스택큐힙리스트
왜 비밀번호에 대해 char[]이 String 보다 우선 적용됩니까? 본문
스윙에서, 패스워드 필드는 보통의 getText() ( String 반환) 방법 대신에 getPassword() ( char[] 반환) 방법을 가지고 있습니다. 비슷하게, 패스워드를 처리하기 위해 String 을 사용하지 않도록 제안이 나왔습니다.
비밀번호에 String이 사용될 때 왜 보안에 위협이 될까요?
char[]를 사용하는 것이 불편해 보이는데요.
답변 1
문자열은 변경할 수 없습니다. 즉, 한 번 생성한 이후 다른 프로세스가 메모리를 덤프할 수 있다면, reflection을 제외하고 데이터를 제거할 방법이 없습니다. garbage collection 이 작동하기 전에.
배열을 사용하면 사용이 끝난 후 데이터를 명확하게 삭제할 수 있습니다. 어떤 것이든 배열을 덮어쓸 수 있으며, 쓰레기 수집 이전에도 시스템 어디에서도 비밀번호가 나타나지 않습니다.
그래, 이것은 보안 문제입니다 - 하지만 char[]를 사용하면 공격자의 기회 창이 줄어들기는 하지만, 이것은 이러한 특정 유형의 공격에 대해서만 해당됩니다.
댓글에서 언급된 대로, 가비지 컬렉터에 의해 이동되는 배열은 메모리에 떠돌이 데이터 복사본을 남길 수 있습니다. 이것은 구현에 따라 다를 수 있는데, 가비지 컬렉터가 이러한 일을 방지하기 위해 가는 길에 모든 메모리를 지울 수도 있습니다. 하지만 그래도 char[]에 실제 문자가 있는 공격 창문이 존재합니다.
답변 2
암호를 저장할 때 String 대신 char[]을 사용하는 것이 좋은 이유는 무엇일까요? String은 변경이 가능한 객체이기 때문에 암호와 같은 민감한 정보를 저장하기에 적절하지 않습니다. 이에 따라 char[]가 보안상 더 안전한 선택입니다.
String은 불변 객체이며 해당 객체가 메모리에서 생성된 이후에 변경할 수 없습니다. 따라서 암호와 같은 민감한 정보가 String으로 저장되면 해당 정보에 대한 레퍼런스는 JVM의 메모리 내에서 계속 유지됩니다. 이 경우 다른 객체가 String 객체를 참조하고 해당 객체를 수정할 수 있다면, 해당 문자열의 암호는 변경됩니다.
하지만 char[]은 변경 가능한 배열이 아니기 때문에 암호와 같은 민감한 정보를 저장할 때 String보다 더욱 안전합니다. char[]에서 사용한 값은 메모리에서 생성된 이후에다 바로 변경할 수 있습니다. 이렇게 하면 암호 값을 변경하는 데에도 문자 데이터 타입을 사용할 수 있습니다.
그러나 프로그래머가 암호 처리를 다루는 적절한 방식을 고려하지 않는다면 char[]를 사용하는 것만으로 충분하지 않습니다. 암호를 안전하게 저장하려면 암호화 방법을 사용해야 합니다. Java에서는 javax.crypto 패키지를 사용하여 암호화를 수행할 수 있습니다.
결론적으로, 암호와 같은 민감한 정보를 안전하게 저장하려면 String 대신 char[]을 사용해야 합니다. 하지만 더욱 안전한 방법을 선택하려면 암호화 방법을 사용하는 것이 좋습니다. 따라서 프로그래머는 예상치 못한 상황이 발생해도 적용하기 쉬운 암호화 방법을 계속해서 고민해야 합니다.