2016-06-08 7 views
2

사용자의 기업 비밀번호를 처리해야하는 Ruby 애플리케이션을 작성하고 있습니다. 암호가 노출 될 가능성을 줄이기 위해 암호가 메모리에있는 시간을 최소화하고 싶습니다.Ruby에서 메모리에서 비밀번호를 안전하게 지우려면

모국어로 데이터를 직접 지울 것입니다. C#에서는 SecureString class을 사용합니다. Java에서는 char[]을 사용합니다. 하지만 Ruby에서 찾을 수있는 최선은 old feature request이며 죽은 것처럼 보입니다.

Ruby에서 메모리의 비밀번호를 안전하게 저장하고 지우는 표준은 무엇입니까? 이 일을하는 수업이 있습니까? Java의 char[]과 유사한 코딩 패턴?

+0

궁극적으로 이것은 L1, L2, L3 캐시 또는 레지스터 자체에 저장된 데이터를 제어 할 수 없으므로 잃어버린 원인입니다. 시스템 메모리에서 데이터를 삭제할 수 있다고 생각하는 사용자는 종종 오해를 불러 일으킬 수 있습니다. 운영 체제는 지식이 없거나 데이터의 흔적을 남기지 않고도 메모리를 다시 매핑 할 수 있습니다. 절대 보안이 필요한 경우 노출 된 암호가있는 응용 프로그램이 필요없는 인증 메커니즘을 사용하십시오. LDAP 나 Oauth와 같은 메커니즘은이 책임을 완전히 없앱니다. – tadman

+0

@ tadman 충분히 좋습니다. 나는 사람들이 사용하는 일반적인 패턴이 있다면 여전히 듣고 싶다. –

+0

[사람들이 암호 개인 키를 어떻게 다루는 지] (http://stackoverflow.com/questions/1263350/cryptography-best-practices-for -keys-in-memory) 이는 보통 암호보다 훨씬 심각한 문제입니다. 솔루션은 대개 매우 복잡하고 비쌉니다. 기본적으로 하드웨어의 안전을 신뢰할 수 없다면 하드웨어를 신뢰하지 말고 우선 비밀번호를 수락하지 마십시오. 다른 인증 메커니즘을 사용하십시오. 기억을 닦으면 위험이 줄어들지 만 그것을 제거하지는 못합니다. – tadman

답변

0

메모리에서 비밀 정보를 안전하게 지우는 것과 관련하여 루비 문제가 5 년 간 존재합니다 (5741). 그 이슈에는 설명하는 몇 가지 링크가 포함되어 있습니다. 왜 메모리에서 암호를 지우는 것이 좋은가? 최근 MacOs에는 암호가 메모리에 저장 되었기 때문에 FileVault2에 문제가있었습니다. 문제 5741 내에서 표시

한 가지 가능한 솔루션입니다 :

pass = "" 
$stdin.sysread(256, pass) # assuming a line-buffered terminal 
io = StringIO.new("\0" * pass.bytesize) 
io.read(pass.bytesize, pass) 

루비 2.3.1p112와 함께 작동하는 것 같다,하지만 난 그것을 약속 할 수 없다.