2012-03-21 2 views
0

내가 설계하고있는 시스템의 경우 특정 문자열이 '유효'한지 여부를 확인할 수 있기를 원하지만 데이터베이스에 '유효한'문자열을 비공개로 유지하려고합니다.암호화 된 데이터베이스에 문자열 존재 확인

모든 유효한 문자열의 데이터베이스를 클라이언트에 제공하려고하지만이 데이터베이스는 (단방향) 암호화됩니다. 내 프로그램의 어셈블리 코드에서 특정 키를 얻을 수있는 방법이 항상 있기 때문에 클라이언트에 키를 배포하는 것을 꺼린다 (나는 생각한다).

클라이언트는 내 프로그램에 문자열을 입력 할 수 있어야하며 암호화 된 파일에 문자열의 존재 여부에 따라 부울을 반환합니다.

더 중요한 것은 내 프로그램에서 문자열이 파일에 있는지 쉽게 확인하지만 다른 프로그램이 데이터베이스를 쉽게 (및/또는 재구성하지 못하도록) 방지하려고합니다.

필자는이 시스템을 약간 추상적으로 표현했습니다. 아직 내 시스템이 어떻게 보이는지 알지 못하기 때문에이 같은 것이 가능한지 알고 싶습니다.

답변

4

당신이 찾고있는 것은 암호화 해시 기능입니다! MD5 및 SHA1은 잘 알려진 예제이지만 엄격한 성능 제약없이 새 코드를 작성하는 경우 SHA256이 선택됩니다. 원래 단어를 복구하기 어려울 경우 scrypt 또는 bcrypt를 고려하고 싶다. (비록 인기가 없지만 표준 라이브러리에 포함시키지 않을지라도). ,

>>> words = ["secret", "hidden"] 
>>> db = set([hashlib.sha256(word).hexdigest() for word in words]) 
>>> db 
set(['2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b', 'e564b4081d7a9ea4b00dada53bdae70c99b87b6fce869f0c3dd4d2bfa1e53e1c']) 
>>> def word_exists(word): 
...  return hashlib.sha256(word).hexdigest() in db 
... 
>>> word_exists("hello") 
False 
>>> word_exists("hidden") 
True 
+0

정말 이것에 대해 생각하지 못했지만, 손의 경우는 조금 특별하다 :

는 그런 다음 데이터베이스는 (파이썬) 같은 해시의 정렬되지 않은 세트처럼 간단 할 수있다 '영업 비밀'은 실제로 파일 해시이기 때문입니다. 다른 사람들이 데이터베이스를 사용하지 못하도록하고 싶기 때문에 다른 사람들이 쉽게 할 수없는 일방적 인 기능을 원합니다. – ralphje

+0

"다른 사람들이 쉽게 할 수없는 단방향 해시 함수"가 의미하는 바를 명확히 할 수 있습니까? 그리고 당신은 다른 사람들이 데이터베이스를 사용하지 못하도록하고 싶다고 말하고 있습니다. 그러나 아마 그것을 사용할 수있는 사람들이있을 것입니다. 사교적 인 차원에서 접근 권한을 가진 사람들과 그렇지 않은 사람들을 구별하는 방법은 무엇입니까? (액세스 권한이있는 사람들은 암호를 사용합니까? 하드웨어 토큰? 암호화 된 네트워크 연결입니까?) –

+0

특정 해시가 데이터베이스에 있는지 여부를 쉽게 확인할 수있는 소프트웨어 프로그램을 가질 수는 있지만 다른 사람들에게는 어렵게 만들고 싶습니다. (다른 프로그램)에서 동일한 데이터베이스를 사용할 수 있습니다. 합법적 인 액세스 (내 프로그램을 통한)가 가능해야하며 액세스 할 수있는 유일한 방법입니다. – ralphje