2010-03-24 3 views
2

이것은 언뜻보기에는 끔찍한 아이디어처럼 들릴지 모르겠지만, 여기에는 나의 시나리오가 있습니다. 사용자 이름 인증을 사용하여 여러 WCF 끝점을 제공하는 Windows 서비스가 있습니다. 사용자 지정 인증자는 로컬 데이터베이스 (암호가 소금에 절인 SHA-1로 저장 됨)에서 사용자의 자격 증명을 조회하거나 다른 서비스에 WCF 요청을 만들어 암호의 유효성을 검사합니다. User 객체에는 내부 또는 외부의 열거 형을 사용하여 사용할 인증 소스를 나타냅니다.WCF 서비스의 메모리에 일반 텍스트 암호 캐싱

lookup + 해시 확인 또는 WCF 호출을 수행하는 것이 서비스에 대한 모든 단일 요청에 대해 비용이 많이 들기 때문에 사용자 이름/암호 정보를 캐시하고 싶습니다. 캐시의 각 항목에는 수명이 있으므로 캐시의 항목이 60 초인 경우에는 다음 요청시 인증자가 캐시 대신 원본 소스에 대한 자격 증명을 확인한 다음 업데이트합니다.

로컬 데이터베이스의 경우 사용자 이름/SHA1 쌍을 사전에 저장할 수 있으며 "내부"사용자의 각 요청에 대해 제공된 암호를 다시 해시하고 비교해야합니다. "외부"사용자의 경우 인증 자에게 제출 된 일반 텍스트 비밀번호 만 갖기 때문에 캐시를 해싱하고 캐시의 일부로 저장할 수 있습니다. 이렇게하면 데이터베이스 요청 또는 원격 서비스 호출의 오버 헤드를 확실히 줄일 수 있지만 매번 해시 작업을 수행해야합니다.

해당 서비스는 네트워크 보안뿐만 아니라 물리적 인 상태가 양호한 내부 서버에서 실행됩니다. 해시 된 버전을 저장하는 대신 캐시에 일반 텍스트 암호를 저장하는 것이 허용되는 방법입니까? 이 경우 내 위험은 프로세스 메모리를 덤프하고 암호를 얻는 공격자 인 것 같습니다. 그 위험을 받아 들일 수 있다고 생각하면 메모리에 일반 텍스트 암호를 사용하지 않아야하는 다른 이유가 있습니까?

평문 암호를 사용하도록 선택하면 SecureString이 내 위험을 어느 정도 제한 할 수 있다고 생각합니다. SecureString을 사용하는 것이 가치가 있습니까? (구현은 매우 둥근 것처럼 보입니까?) 나는 암호화되지 않은 암호를 지속적으로 저장하는 위험에 대해 잘 알고 있지만, 일반 텍스트 암호의 휘발성 저장소에 대한 동의가 무엇인지 확신 할 수 없습니다.

답변

2

SecureString은 암호화 된 메모리를 사용하므로 해싱을 수행 할 때마다 성능이 향상 될 가능성이 높습니다. 그러나 사용자 환경에서 프로파일 링해야합니다.

평범한 암호를 메모리에 저장할 위험에 관해서는이 문맥에서 대답 할 수있는 질문이 아닙니다. 나는 그저 그렇다고 말할 수있다. 왜냐하면 그것은 여러 가지 이유로 나의 상황을위한 것입니다. 그러나 그것은 당신 것과 같지 않을 것입니다.

내가 제안하는 바는 다음과 같습니다. 암호 유출의 파급 효과를 고려하십시오 - 기본적으로 해커가 암호를 소지하는 것이 얼마나 가치가 있을까요 ($ 또는 $$$?)? 오늘날 대부분의 보안 문제는 경제적 인센티브에서 비롯됩니다. 상대적으로 말하자면, 순수 파괴 행위는이 사람들에 의해 우위를 점하고 있습니다.

이제는 보안이 완전히 다른 방식, 즉 SQL 주입 또는 사용자에게 "계정 확인"으로 전화를 걸 수있는 가능성과 비교하십시오. 몇 가지 암호의 $ 값이 높고 암호를 구할 수있는 다른 방법이 없다면 암호를 계속 암호화해야합니다. 이제는 더 강력한 서버 비용을 정당화했습니다. 그리고 해독기가 서버를 확보하면 암호 키를 안전하게 보호 할 수 있습니다. 이러한 키는 프로그램 메모리처럼 쉽게 액세스 할 수 있습니다.

반면에 값이 낮고 쉽게 사용할 수있는 다른 가능한 공격이있을 경우 (그리고 종종있는 경우도 있습니다) 해커가 서버를 손상시키고 덤프 할 가치가 없다는 합리적인 주장을 할 수 있습니다 기억.

행운을 빈다.

+0

아주 좋은 점. 토론 후에는 WCF 사용자 지정 사용자 인증이 일반 텍스트로 암호를 전달한다는 것을 알았습니다. 따라서 특정 시점에서 메모리에 일반 텍스트 암호 (인증과 해당 변수가 GC'ed되었을 때)가 있습니다. 그래서 그들 (특히 하나의 만료)의 캐시를 가지고 우리의 위험을 많이 증가하지 않습니다. 좋은 점을 가져 주셔서 감사합니다. 토론에서 가져 왔으며 이것이 우리 환경에서 받아 들일 수 있다는 결론에 도달하는 데 도움이되었습니다. –

1

해당 서비스는 네트워크 보안뿐만 아니라 물리적 인 상태가 양호한 내부 서버에서 실행됩니다.

캐시 된 암호를 램에 일반 텍스트로 저장하는 것이 영원 (또는 다음 번 패치)이 될 때까지는 사실입니다. 만약 당신이 램에 전체 패스워드 DB를 저장하고 있다면 (영구 저장 장치가 너무 느리다) 보안 스트링으로 저장하는 것이 더 좋을 것이라고 생각하지만, 단지 1 분 동안 몇 개의 패스워드만을 저장하고 있기 때문에 아무런 문제가 없다.

+0

비밀번호를 얻는 데 1 백만 달러의 가치가 있다고 말하지 않는 한 - 유혹을받을 수도 있습니다. :) –