2008-08-27 6 views
15

데이터베이스의 암호를 보호하기위한 좋은 단순 암호화 체계는 무엇입니까? 나는 과도하게 안전하지 않은 것도 필요하지 않으며 번개가 빠른 것도 필요하지 않습니다. 그러나 그 일은 좋을 것입니다. 주로, 나는 몹시 느리거나 불안정하지 않고 구현하기 쉬운 것을 원한다.간단한 암호 암호화

답변

13

mk에서 말한 것처럼 SHA1 또는 MD5는 SHA2와 함께 표준입니다.

원하는 것을 더 일반적으로 암호화 해시 함수라고합니다. 암호화 해시는 단방향으로 설계되었습니다 (결과 해시가 주어지면 원래 입력을 파생시킬 수 없어야 함). 또한 동일한 해시 (해시 충돌이라고도 함)가있는 임의의 두 문자열의 가능성은 낮아야합니다 (이상적으로 1/해시 값의 수).

비밀번호가 해시 된 것이므로 해시 된 버전을 안전하게 유지하기 위해 노력하지 않아도됩니다. 너무 많은 사람들이 약한 암호를 사용하여 오프라인 공격에 취약합니다.

편집 - 여러 사람이 이미 소금 사용의 중요성을 지적했습니다. 소금은 해시 함수를 사용하기 전에 입력 값과 혼합되는 상수 값입니다. 고유 한 소금을 사용하면 오프라인 공격자가 미리 계산 된 공통 암호 (무지개 표) 표를 사용하여 암호를 더 신속하게 무력화 할 수 없습니다.

+2

OP의 경우 : MD5 또는 SHA1/2와 같은 단방향 해시를 사용하는 경우 해시를 "해독"할 수 없습니다. 즉 해시 문자열에서 원본 일반 텍스트 비밀번호를 복구 할 수 없습니다. 사용자가 로그인 할 때 암호를 테스트하려면 입력 된 암호에 동일한 해시를 적용하고 두 해시를 비교하십시오. –

2

고유 한 소금과 함께 단방향 해싱 알고리즘 SHA을 사용하십시오. 그것은 데이터베이스에 암호를 저장하는 데 사용하는 주요 알고리즘입니다.

9

MD5 또는 SHA1을 사용하는 경우 레인보우 테이블 해킹을 방지하기 위해 소금을 사용하십시오.

는 C#에서이 쉽다 :

MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider(); 
string addSalt = string.Concat("ummm salty ", password); 
byte[] hash = hasher.ComputeHash(Encoding.Unicode.GetBytes(addSalt)); 
0

MD5 또는 SHA에 대해 소금으로 두 번째 투표했습니다. 주요 웹 개발 언어에는 해시를 계산하기위한 기능이 내장되어 있습니다 (예 : PHP에서 mcrypt 패키지에는 필요한 기능이 포함되어 있음).

+0

왜 사람들이 무작위로 주위에 가서 완벽하게 합법적 인 답변을 downvote합니까? –

0

위에서 제안한 SHA-1 같은 단방향 해시 알고리즘을 소금으로 사용해야합니다. 나는이 사이트에서 더 많은 정보를 제안 할 것이다. 여기에는 몇 가지 샘플 코드/구현이 포함됩니다. http://www.obviex.com/samples/hash.aspx

0

더 나은 보안을위한 열쇠는 역동적 인 소금을 사용하는 것입니다. 즉, 각 새 사용자에 대해 임의의 문자열을 생성하고 해당 문자열을 사용하여 해시를 암호화합니다. 물론 나중에 암호를 확인할 수 있도록이 소금을 데이터베이스에 저장해야합니다 (암호를 암호화하지는 않습니다).

3

몇 주 전에 내 문제였습니다. 우리는 대규모 MIS 프로젝트를 975 개의 서로 다른 지리적 위치에 배치하여 우리 자신의 사용자 자격 증명 저장소가 이미 구현되고 사용되는 다양한 응용 프로그램 집합에 대한 인증 자로 사용될 것입니다.우리는 이미 REST와 SOAP 기반 인증 서비스를 모두 제공했지만 고객은 DB 연결만으로 관련 테이블이나 뷰의 읽기 전용보기 만 사용하여 다른 응용 프로그램의 사용자 자격 증명 저장소에 연결할 수 있어야한다고 주장했습니다. 한숨 ... (이 매우 결합 된 나쁜 디자인 결정은 다른 질문의 주제입니다). 앉아서 사양에 우리의 소금과 반복적으로 해시 암호 저장 방식을 변환하고 쉽게 통합에 대한 몇 가지 다른 언어 구현을 제공 할 수 강제

.

우리는이를 공정한 해쉬 된 암호 또는 간단히 FSHP이라고 부릅니다. Python, Ruby, PHP5로 구현하여 Public Domain에 공개했습니다. GitHub에서 섭취, 갈래, 불꽃 또는 침을 먹을 수 있습니다. http://github.com/bdd/fshp

FSHP는 반복적으로 해시 된 암호 해시 구현입니다.

디자인 원리는 RFC에서 PBKDF1 사양과 유사하다 2898 (일명 : PKCS # 5 :. 암호 기반 암호화 사양 버전 2.0) FSHP는 소금 장, 숫자의 반복과 기본 암호 해시를 선택 허용 SHA-1 및 SHA-2 (256, 384, 512) 중 하나의 기능입니다. 모든 출력의 시작 부분에 메타 프리픽스를 정의하면 소비자가 자신의 암호 저장소 보안 기준선을 선택할 수있게하면서 이식 할 수 있습니다.

SECURITY :

기본 FSHP1은 SHA-256 해시 4096 개 반복하여 8 개 바이트의 염을 사용한다. - 8 바이트 소금은 필수 공간에 2^64를 곱하여 무지개 표 공격을 실용적이지 않게 만듭니다. - 반복 횟수가 4096이므로 무차별 대입 공격이 상당히 비쌉니다. - 이 릴리스에서과의 충돌을 찾기 위해 SHA-256에 대해 알려진 공격이 2^128 개 미만의 연산으로 나타납니다.

구현 :

  • 파이썬 : 2.3.5 2.5.1 (hashlib/w)으로 테스트, 2.6.1
  • 루비 : 1.8.6
  • PHP5으로 테스트 : 테스트 with 5.2.6

누락 된 언어 구현을 만들거나 모든 언어 구현을 환영합니다. 현재 은 현재의 것을 연마합니다.

(파이썬) 기본 조작 :

>>> fsh = fshp.crypt('OrpheanBeholderScryDoubt') 
>>> print fsh 
{FSHP1|8|4096}GVSUFDAjdh0vBosn1GUhzGLHP7BmkbCZVH/3TQqGIjADXpc+6NCg3g== 
>>> fshp.validate('OrpheanBeholderScryDoubt', fsh) 
True 

지하실 사용자 정의 :

하는의 우리의 암호 해시 체계를 약화 보자. - 소금 길이를 기본값 8에서 2로 줄입니다. - 반복 횟수를 기본값 4096에서 10으로 줄입니다. - SHA-1을 기본 해시 알고리즘으로 사용하여 FSHP0을 선택하십시오.

>>> fsh = fshp.crypt('ExecuteOrder66', saltlen=2, rounds=10, variant=0) 
>>> print fsh 
{FSHP0|2|10}Nge7yRT/vueEGVFPIxcDjiaHQGFQaQ== 
0

비가역 암호화의 경우 가장 확실하게 SHA256 또는 SHA1을 사용합니다. MD5는 현재 많은 충돌을 가지고 있으며 많은 노력이 깨져 있으므로 사용하기에 적합하지 않습니다.

0

솔루션을 미래 보장하려면 SHA256 또는 SHA512를 권장합니다. 암호화 된 geekworld는 MD5와 약간 낮은 정도의 SHA1에 대한 불안감을 안고 있습니다.

또는, 당신은 내가 특히 유래에 제대로 해싱 비밀번호를 수행하는 방법에 대한 많은 혼란을 발견했습니다 SHA-3

0

기다릴 수 있다면. 그래서 모든 것을 정리해야하는 페이지를 작성했습니다. 간단한 해시를 사용하는 것보다 조금 더 있습니다.

상세 정보 : How to do password hashing properly

+2

조금 더 정교하기 위해 * 답을 편집 할 수 있습니까? 이것은 거의 귀하의 페이지에 대한 뻔뻔한 플러그 (* 스팸 *) 느낌. 페이지에 좋은 정보가 포함되어 있습니다. – jschmier

관련 문제