2008-09-25 3 views
17

설정 파일에 데이터베이스 암호를 저장해야합니다. 명백한 이유 때문에, 나는 그들을 (바람직하게 AES로) 암호화하고 싶다. 누구든지 Delphi 구현을 알고 있습니까? 10,000 개 이상의 역사적으로 재배 된 (URGH!) 소스 코드가있는 기존 프로젝트에 쉽게 도입 할 수 있습니까?Delphi에서 암호 암호화

설명 : 쉽게 프로젝트에 단위를 추가하고 최대를 추가하는 것을 의미합니다. 구성 파일을 읽고 5 행으로 끝내는 5 줄의 코드. 15 분 이상 걸리지 않아야합니다.

다른 설명 : 응용 프로그램에 대한 사용자 관리 체계를 지원하지 않고 db에 대한 연결을 생성하려면 암호가 필요합니다. 그래서 해시를 사용하는 것은 도움이되지 않습니다. db 엔진은 앱이 아닌 비밀번호가 유효한지 확인합니다.

+0

데이터베이스를? 요즘 일반을 사용하는 것보다 연결하는 더 나은 방법은 이전 사용자/암호 쌍 –

+0

이 있습니다 당신은이 문서 확인하실 수 있습니다 창을 사용하는 경우 : [Windows에서 암호를 저장하는 안전한 방법] [1] 을 [ 1] : http://stackoverflow.com/questions/13145112/secure-way-to-store-password-in-windows – wittrup

답변

16

David Barton의 DCPCrypt library에 대한 권장 사항보다 두 번째입니다. 나는 여러 프로젝트에서 successfuly 그것을 사용하고, 당신이 사용 예제를 읽은 후 15 분 이상 걸리지 않을 것입니다. MIT 라이센스를 사용하기 때문에 상용 프로젝트 등에서 자유롭게 사용할 수 있습니다. DCPCrypt는 AES 인 Rijndael을 비롯한 여러 가지 알고리즘을 구현합니다.

googlable 독립 실행 형 (단일 유닛) 구현체가 너무 많습니다. 특정 라이브러리의 수정 사항을 직접 확인하지 않는 한 신뢰할 수있는 질문이 있습니다.

+3

DCPCrypt는 훌륭합니다. 나는 그것을 많은 장소에서 사용하고있다. – gabr

+1

(오래된 스레드에서) 가치가있는 부분에 대해 나는 방금 DCPcrypt를 설치하고 환상적으로 작동합니다. – dpant

2

이 글은 library입니다. 정말 빠르게 추가했습니다. 그러나 wiki shows 몇 가지 솔루션이 더 있습니다.

2

암호화하더라도 암호화 된 암호뿐만 아니라 암호 해독 키도 모두 실행 파일에 포함되어있는 것으로 보입니다. 즉, 어떤 방법으로도 보안이 유지된다는 것을 의미하지 않습니다. 누구나 암호 해독 키와 암호화 된 암호를 사용하여 원시 암호를 생성 할 수 있습니다.

원하는 것은 단방향 해시입니다.

+0

편도 해시가 이상적이지만 다시 해독 할 방법이 없습니다. 그의 응용 프로그램이 데이터베이스에 연결할 수 있도록 암호를 읽어야 할 필요가있는 것 같습니다. 해시는 이전에 저장 한 것과 동일한 암호가 있는지 확인하려는 경우에만 작동합니다. –

+0

해싱은 옵션이 아닙니다. 데이터베이스와의 연결을 설정하려면 암호가 필요합니다. 나는 db를 통제 할 권한이 없다. – Treb

+0

하지만 Nick이 옳습니다. 응용 프로그램에 키를 저장하면 방금 암호를 해독하는 데 어려움이 있습니다. 열쇠도 보호해야합니다. –

0

닉은 당연한 것입니다. 보안 솔루션 구현에 15 분을 소비하기를 원한다고 할 때 뭘하는지 알고 있다고 가정합니다. 또한 DCPCrypt 라이브러리는 해당 (더 나은) 경로로 이동하기로 결정하면 여러 해싱 알고리즘을 구현합니다.

8

나는 Turbopower 얽힌이 criptography위한 훌륭한 도서관이라고 생각 :

http://sourceforge.net/projects/tplockbox/

그것은 당신의 용도에 너무 큽니다하지만 매우 쉽게 쓸 수 있으며 당신이 문자열을 암호화 할 수 있다면 나도 몰라 5 줄의 코드. 모든 예제에 있습니다.

+0

늙고 오래 살 수는 없습니다. 필요한 개선 사항 (예 : 블록 암호, 큰 키)을 지원하지 않습니다. 업데이트하기위한 노력이 있지만 지금은 사용할 라이브러리가 아닙니다. –

15

일반 인증의 경우 암호를 저장할 필요가 없으므로 사용자가 입력 한 암호가 올바른지 확인하기 만하면됩니다. 그럴 경우 대신 해시 서명 (예 : MD5)을 저장 한 다음 입력 된 비밀번호의 서명과 비교하면됩니다. 두 서명이 일치하면 입력 한 암호가 정확합니다.

누군가가 "마스터"암호를 얻으면 모든 사용자의 암호를 검색 할 수 있기 때문에 암호화 된 암호를 저장하면 위험 할 수 있습니다.

MD5를 사용하기로 결정한 경우 Delphi와 함께 제공되는 MessageDigest_5.pas를 사용할 수 있습니다 (적어도 Delphi 2007 사본에 포함되어 있음). 선택할 수있는 Delphi 소스 코드가있는 다른 구현도 있습니다.

+4

+1은 암호 해싱과 암호 저장의 위험성을 언급합니다. 절대 암호를 저장하지 마십시오 (암호 화를 생각하지 마십시오!). –

+2

데이터베이스 연결을위한 암호 저장에 대해 논의 중이라면 해시를 적용해야합니까? 데이터베이스에 연결하려면 실제 암호가 필요합니다. 또는 마스터 데이터베이스 암호를 입력하기 위해 모든 사용자에게 암호를 배포하도록 제안 하시겠습니까? –

3

TOndrej에는 올바른 접근 방식이 있습니다. 가역성 암호기를 사용하여 암호를 저장하면 안됩니다.정확하게 지적했듯이 "마스터"키가 손상된 경우 전체 시스템이 손상됩니다. MD5와 같은 되돌릴 수없는 해시를 사용하면 훨씬 안전하며 해시 값을 일반 텍스트로 저장할 수 있습니다. 간단히 입력 된 암호를 해시 한 다음 저장된 해시와 비교하십시오.

+5

해싱은 옵션이 아니므로 데이터베이스와의 연결을 설정하려면 암호가 필요합니다. 나는 db를 통제 할 권한이 없다. – Treb

1

알림.

다른 사람과 상호 운용 할 필요가없는 경우 libs를 암호화하면 DCP 또는 LockBox에서 작업을 수행합니다.

하지만

당신이의 rinjdael 사양을 완전하게 준수 무료로 부품을 잊지해야하는 경우

, 라고요 좀 "형편없는"대부분의 시간.

3

나는 항상 사용자 Turbopower Lockbox를 사용해 왔습니다. 잘 작동하고 사용하기가 쉽습니다. 나는 사실 똑같은 것을 위해 그것을 실제로 사용한다. 설정 텍스트 파일에 패스워드를 저장한다. 다른 사람들이 당신이 해독 가능한 암호화를 사용하여 암호를 저장하지 않도록해야 인증 목적으로, 지적으로

http://sourceforge.net/projects/tplockbox/

1

, 당신은 암호 해시를 저장하고 해시에 대해 사용자가 제공 한 암호 해시를 확인해야 즉 당신 저장했습니다. 그러나 이러한 접근 방식에는 약점이 있습니다. 공격자가 암호 저장소 데이터베이스를 보유해야하는 경우 rainbow table 공격에 취약합니다.

당신이해야 할 일은 미리 선택한 (그리고 비밀) 소금 값 + 암호의 해시를 저장하는 것입니다. 즉, 소금과 암호를 연결하고, 결과를 해시하고,이 해시를 저장합니다. 인증 할 때 소금 값과 사용자가 입력 한 암호, 해시 값을 연결 한 후 동일성을 검사하십시오. 이것은 레인보우 테이블 공격을 실행 불가능하게 만듭니다.

물론 사용자가 네트워크를 통해 암호를 보내는 경우 (예를 들어 웹 또는 클라이언트 - 서버 응용 프로그램에서 작업하는 경우) 암호를 일반 텍스트로 보내지 말고 저장하는 대신 해시 (소금 + 해시 (암호))를 저장하고 확인해야하며 클라이언트가 사용자가 제공 한 암호를 미리 해시 한 다음 네트워크를 통해 보내야합니다. 이렇게하면 사용자가 여러 목적으로 동일한 암호를 다시 사용해야 만 사용자의 암호도 보호 할 수 있습니다.

+1

해싱은 옵션이 아니므로 데이터베이스와의 연결을 설정하려면 암호가 필요합니다. 나는 db를 통제 할 권한이 없다. 하지만 고마워요 상세한 설명을! – Treb

1

일부 유형의 소금을 사용하는 것이 좋습니다. crypt (password)를 설정 파일에 저장하지 말고이 저장소 crypt (salt + password)를 설치하십시오. '소금'으로 데이터베이스를 여는 데 필요한 것을 사용할 수 있습니다. db_name + user_name. 암호 함수의 경우 AES, Idea, DES 등의 잘 알려진 알고리즘을 사용하거나 다른 문자열의 각 바이트를 xoring하여 해당 문자열을 키로 사용할 수 있습니다. 해결하기 위해 좀 더 다른 것을 만들려면 임의의 바이트를 사용하고 저장할 수 있습니다.

그래서 저장하기 :

  1. init_str을 = 5 난수 바이트
  2. 여기서 new_password = 소금 + 암호 // 소금 = DB_NAME + _ 이름
  3. crypted_password = xor_bytes (init_str + 여기서 new_password, '내 keyphrase를 ')
  4. crypted_password : 설정에서 = init_str + crypted_password
  5. 저장 crypted_password,이 같은 당신이 hexify 수있는 바이트 또는 64 기수 그것을
  6. 될 것입니다

그리고3210 연결할 : init_str로 설정에서 읽을

  1. 분할 데이터 및 crypted_password
  2. 여기서 new_password = xor_bytes (init_str + crypted_password, '내 keyphrase를')
  3. 비밀번호 : = 제거 (DB_NAME + user_name) from new_password
3

터보 파워 록 박스 3 (http://lockbox.seanbdurkin.id.au/)는 자동 염도를 사용합니다. IV가 염분이 없기 때문에 Barton의 DCPCrypt에 대해 권합니다. 어떤 상황에서는 이것이 매우 심각한 고문의 결함입니다.

이전 회의와 달리 LB3의 AES 구현은 표준을 완벽하게 준수합니다.

+0

1) 버전 3이 안정적입니까? 2) 라이센스가 GPL3으로 변경되었으며, 귀하가 권리를 가지고 있는지 궁금합니다. 많은 상용 개발자들은 GPL 라이브러리에서 벗어나기를 선호합니다. –

+0

1) 상태는 웹 사이트를 참조하십시오; 2) 아니요, 맞지 않아요. 두 개의 LockBox 라이브러리 중 하나에서 라이센스가 변경되지 않았습니다. LockBox 2는 MPL 하에서 배포됩니다. LockBox 3은 LGPL3 (GPL 아님)에서 배포됩니다. LB2와 LB3은 공통 소스 코드를 공유하지 않습니다. 상용 개발자가 LGPL을 피할 수는 없다. 단지 비합리적 일 뿐이다. –

0

솔루션의 몇 :

  • 전혀 암호를 저장하지 마십시오. 데이터베이스가 통합 인증을 지원하는 경우 사용하십시오.
  • 사용하는 Windows 인증서 저장소를 특정 ID로 실행, 자동 데이터베이스에 의해 인증을 설정할 수 있습니다 과정과 인증서 비밀번호를 암호화합니다. 암호를 애플리케이션에 저장하는 경우 보안이 거의 없으므로 키도 보호해야합니다.
0

현재 사용자 만 액세스 할 수있는 장소에 저장해야합니다. EFS encrypted file에서

  1. 스토어를 :

    은 기본적으로이 작업을 수행하는 두 가지 방법이 있습니다.

  2. secure local storage에 저장하십시오.

Internet Explorer를 2. 사용하지만 로컬 액세스를 얻을 수 있다면 당신이 바로 마스터 키와 알고리즘이있는 경우, 당신은 둘 다 1과 2를 해독 할 수 있습니다 (예를 들어, iepv 인터넷 익스플로러의 암호를 얻을 수 있습니다) .

so :
가능한 경우 암호 저장을 피하십시오.
먼저 Windows 인증, 디렉터리 서비스 등과 같은 대안을 찾으십시오.

--jeroen

관련 문제