2009-06-11 5 views
19

짧은 시간 동안 사용자의 암호를 메모리에 저장해야합니다. 어떻게 그렇게 할 수 있습니까? 그런 정보가 실수로 코레 도프 또는 추적 기록에 공개되지 않았습니까? 값을 "민감한"것으로 표시 할 수있는 방법이 있습니까? 따라서 디버거가 아무 곳에 나 저장하지 않습니까?파이썬에서 중요한 데이터로 표시하기

+0

이 질문을 참조하십시오 : http://stackoverflow.com/questions/728164/securely-erasing-password-in-memory-python – Miles

답변

30

편집 나는 제로 메모리에 (다시 C를 사용하는)하는 ctypes를 사용하는 솔루션을 만들었습니다

.

import sys 
import ctypes 

def zerome(string): 
    location = id(string) + 20 
    size  = sys.getsizeof(string) - 20 

    memset = ctypes.cdll.msvcrt.memset 
    # For Linux, use the following. Change the 6 to whatever it is on your computer. 
    # memset = ctypes.CDLL("libc.so.6").memset 

    print "Clearing 0x%08x size %i bytes" % (location, size) 

    memset(location, 0, size) 

본인은이 코드의 안전성을 보장하지 않습니다. x86 및 CPython 2.6.2에서 작동하는지 테스트되었습니다. 더 긴 writeup은 here입니다.

파이썬에서 암호 해독 및 암호화가 작동하지 않습니다. Strings와 Integers는 구속력 있고 영구적인데, 이는 당신이 모든 곳에 암호 정보를 남기고 있음을 의미합니다.

해싱은 표준 답변이지만 물론 일반 텍스트는 결국 어딘가에서 처리해야합니다.

정확한 해결책은 민감한 프로세스를 C 모듈로 수행하는 것입니다.

그러나 메모리가 지속적으로 손상되는 경우 보안 설정을 다시 생각해보아야합니다.

+2

이것은 옳습니다. 암호를 파이썬 객체로 읽어 들이면 덤프에 의해 암호가 손상 될 가능성이 있습니다. C를 사용해도 완벽하지는 않습니다 (여전히 프로그램을 멈추고 커널 수준의 디버거를 사용할 수는 있지만). –

+0

쓰기 작업이 종료되었습니다. :( – Barry

+0

다음 기사에서 언급 한 'memset'과 같으면 안전하지 않습니다 .http : //www.viva64.com/en/b/0178/ 또는 https://www.owasp.org /index.php/Insecure_Compiler_Optimization – Danny

2

"민감한 것으로 표시"할 방법이 없지만, 메모리에있는 데이터를 암호화하고 사용해야 할 때 다시 해독 할 수 있습니다. 완벽한 해결책은 아니지만 내가 생각할 수있는 최선의 방법입니다. 한 번 패드

2
  • XOR은
  • 항상 오히려 암호 자체

보다 소금에 절인 해시를 저장하거나, 당신이 덤프에 대해 매우 편집증이 있다면, 다른 독특한 임의의 키를 저장 별도로 저장 장소, 예. 내가 다른 스레드, 레지스트리에 등 서버에

4

... 유일한 해결책은 변경 가능한 데이터 구조를 사용하는 것입니다. 그 , 당신은 당신이 동적으로 요소를 대체 할 수 있도록 데이터 구조를 사용해야합니다. 예를 들어, 파이썬에서는리스트를 사용하여 문자 배열을 저장할 수 있습니다. 그러나 요소를 추가하거나 제거 할 때마다 코드는 구현 세부 정보에 따라, 등의 전체 목록을 복사 할 수 있습니다. 안전을 위해 데이터 구조의 크기를 동적으로 조정해야하는 경우 새 데이터를 만들고 데이터를 복사 한 다음 이전 데이터를 복사하십시오. 예를 들면 :

def paranoid_add_character_to_list(ch, l): 
    """Copy l, adding a new character, ch. Erase l. Return the result.""" 
    new_list = [] 
    for i in range(len(l)): 
    new_list.append(0) 
    new_list.append(ch) 
    for i in range(len(l)): 
    new_list[i] = l[i] 
    l[i] = 0 
    return new_list 

출처 : http://www.ibm.com/developerworks/library/s-data.html

  • 저자 : Viega는 ([email protected]) 안전 소프트웨어 구축의 공동 저자이다 (애디슨 - 웨슬리, 2001) Java Enterprise Architecture (O'Reilly and Associates, 2001)을 참조하십시오.John은 주로 소프트웨어 보안 영역에서 5035 개 이상의 기술 서적을 저술했습니다. 그는 또한 Mailman, GNU 메일 링리스트 관리자 및 ITS4에 C 및 C++ 코드의 보안 취약점을 찾아 내기위한 도구 을 작성했습니다.
+0

변종으로이 기술을 사용하여 [bytearray] (https : //docs.python.org/3.1/library/functions.html#bytearray)는'bytes' 인스턴스 대신 사용할 수있는 객체를 생성합니다 많은 파이썬 코드에서 ... 등가 적으로 삭제 될 수 있습니다. –