2011-01-30 3 views
2

웹 서비스와 상호 작용하는 응용 프로그램을 구축 중입니다. 해당 웹 서비스를 사용하려면 실제 사용자 이름과 암호를 사용하여 로그인해야합니다. 서비스를 사용할 다른 방법은 없습니다.자바 - 코드에 사용하기 위해 필요한 사용자 계정 세부 정보를 안전하게 저장합니다.

내가 지금처럼 내 세부 하드 코드하지 않습니다,

String username = "MyUsername"; 
String password = "MyPassword"; 

나는 내용을 암호화하고 파일에 저장에 대한 생각,하지만 그럼에도 불구하고, 사람이 어떤 프로그래밍 경험이있는 사람 내 소스 코드를보고 정보를 쉽게 복구 할 수 있습니다.

File f = load("mydetails.txt"); 
String[] = recoverDetails(f); //or something like that 

이 정보를 저장하는 가장 안전한 방법은 무엇입니까?

+1

응용 프로그램 (웹 서비스를 사용하는 응용 프로그램)이 사용자에게 배포하는 것이거나 자신의 서버에서 실행하는 인터넷 응용 프로그램입니까? – erickson

+0

관련 질문 : http://stackoverflow.com/questions/992019/java-256-bit-aes-password-based-encryption –

답변

3

정말로이라면 안전하게 보호되기를 원한다면 암호로 안전한 "볼트 파일"에 잠궈 야합니다. 누군가 — 당신이나 누군가가 신뢰할 수 있지만 여기에 적합합니다. —은 볼트 (기본적으로 또 다른 비밀 번호)를 잠금 해제하는 열쇠를 제공하고 소프트웨어가 저장된 정보에 액세스 할 수 있습니다.

비밀 번호가있는 사람이 응용 프로그램을 시작하는 데 관련이 없다면 정보를 완전히 숨길 수있는 방법이 없을 것입니다. 이것은 현실의 단순한 사실입니다. 많은 사람들 (DVD 컨소시엄과 같은)은 자신의 위험을 부정하기 위해 투쟁합니다.

2

파일에 저장하지만 파일은 읽기 전용으로 만들어야하며 서비스 프로세스에서만 읽을 수 있도록 설정하십시오.

응용 프로그램을 멀리두고 싶다면 로그인 정보를 복구 할 수 없도록 보안을 설정할 필요가 없습니다. 죄송합니다.

일반적으로 서버 측 보안을 제공하고 각 사용자에게 공개 API를 제공하여 자신의 자격 증명을 제공합니다. 특수 키를 가져와 API를 사용해야하는 Google지도와 같아서 Google이 합법적 인 방식으로 API를 사용하는지 추적 할 수 있습니다.

0

사람들이 내 코드를 볼 수 있다고 제안 했으므로 자신의 하드웨어에서 소프트웨어를 실행할 수 있습니다. 즉, 루트가 있고 읽기 전용 제한이 없으면 궁극적으로 소프트웨어가 실행됩니다. .

내가 생각할 수있는 유일한 안전한 방법은 다음

  • 스마트 카드
  • 암호화 공개 키 암호에 자신에게 전자 서명을 얻고 그것을
를 저장

이렇게하면 자격 증명을 사용하는 유일한 방법은 카드에 읽기 전용으로 저장되고 추가 암호 (PIN 코드)로 액세스되는 개인 키로 암호를 해독하는 것입니다.

지적한 바와 같이, 비밀 요소 (개인 키의 PIN 코드 및 스마트 카드의 물리적 소유권)를 보유하고있는 사람 요소가 없다면 정보를 100 % 안전하게 유지할 방법이 없습니다.

0

해시 함수를 사용해야하며 데이터베이스 암호는 일반 텍스트로 저장해서는 안되며 해시 값으로 저장해야합니다. 그런 다음 해시를 데이터베이스에만 제공하고 거기에 해시도 있으므로 걱정할 사항은 없습니다.

그러나 프로그램에서 일반 텍스트를 사용해야하는 경우 디버거가있는 공격자는 사용자가 데이터베이스에 제공 한 시간에 사용자 이름과 암호 AT 값을 찾을 수 있습니다. 외부 공격자는 스니핑 도구 (예 : wireshark)로 네트워크를 관찰하고 안전하지 않은 네트워크 프로토콜을 사용하는 경우 값을 얻을 수 있습니다. 따라서 프로그램을 실행하는 동안 일반 텍스트 사용자 이름 암호 쌍을 사용하지 않는 것이 좋습니다.

어쨌든 가장 쉽고 안전한 방법은 사용자 이름/암호 쌍을 암호화하는 것입니다. 서버에 암호를 보내면 암호를 해독하여 서버로 일반 텍스트로 보내야합니다 암호화를 이해하지 못합니다. 그러나 서버에 대한 액세스 권한이 있다면 암호를 일반 텍스트로 저장하지 않도록 약간 수정해야합니다.

건배.

1

코드가 배포되는 위치는 언급하지 않았습니다. 응용 프로그램이 고객의 컴퓨터에서 실행되고 웹 서비스 요청을 직접 수행하는 경우 다른 사람이 자격 증명을 얻지 못하게 할 수 없습니다. 암호화 한 경우에도 응용 프로그램에서 사용할 수 있도록 렌더링 할 수 있어야하므로 해독 키를 사용할 수 있어야하며 사용자에게 전달해야합니다. 안전하게 암호화 할 수 있다고해도 사용자는 아웃 바운드 네트워크 트래픽을 스니핑하는 것과 같은 상자이므로 다른 방법을 사용할 수 있습니다.

웹 서비스 호출을하는 코드가 서버에있는 경우 동일한 문제가 있지만 최소한 환경을 제어해야합니다. 어떤 시점에서 서버는 웹 서비스 요청을하기 위해 암호화 된 자격 증명을 사용 가능한 형태로 렌더링해야하므로 웹 서비스 자격 증명을 암호화 할 수 있지만 코드에 액세스하려면 암호 또는 인증서를 사용할 수 있어야합니다. 매번 인증서에 대한 암호 문구를 입력하기 위해 사람이 매달려 있지 않는 한이 모든 작업은 자격 증명을 중첩하지만 보안을 유지하지 못합니다.

물론이 답변은 코드에서 안전하지 않은 웹 서비스 요구 사항의 문제를 해결하기위한 것이 아닙니다. 호출 할 수있는보다 안전한 동등한 웹 서비스 (API 키와 사용자 자신의 자격 증명을 사용하거나 보안 토큰을 생성하는 것)를 찾거나 적절한 방법으로 웹 서비스 공급자를 로비에 초대하십시오. 트위터와 페이스 북의 보안에 관한 최근의 진보를 살펴보면 사용자 수요가 변화를 가져올 수 있습니다.

0

다른 사람들이 지적했듯이 암호를 외울 수있는 마법의 방법은 없습니다 (논리적으로 불가능합니다, DVD 복사 방지). 그러나 잠재적 인 피해를 최소화하기 위해 몇 가지 보안 예방 조치를 취해야합니다. 서버를 제어하지 않으면

다음, (예를 들어, 당신은 공유 호스트에서 응용 프로그램을 실행하는) :

  • 은에 로그인하는 웹 서비스 계정을 확인합니다 (MyUserName 에다/MyPassword와 함께) 만있다 이 응용 프로그램의 목적에 필요한 최소한의 권한.
  • 배포 용 계정이므로 다른 앱/설치에 영향을 미치지 않고이 계정을 잠글 수 있습니다.

그리고 당신은 또한에 다음 서버를 제어 할 경우 :

  • 서버 보안, 즉 등 방화벽, 최신 패치를 설치, 모니터링, 로그, 정상 진행중인 시스템 관리자의 작업
관련 문제