문제

무엇을 원하는 방법/데이터에 대한 암호를 저장하는 데이터베이스에서(바람직하게는 SQL Server2005).는 방법을하고있다 그것은 여러 가지의 우리의 응용 프로그램을 처음 사용.NET 암호화 라이브러리고 다음 데이터베이스에 저장할 바이너리로(16).이 선호하는 방법 또는 해야 나를 사용하여 다른 형식 또는 할당하는 것보다 더 많은 공간 16?

도움이 되었습니까?

해결책

나는 데이터베이스에 비밀번호와 동등한 소금에 절인 해시를 저장하고 암호 자체를 절대 저장 한 다음 해시를 항상 사용자가 전달한 것 중 하나와 비교합니다.

문자 그대로의 암호 데이터를 어디서나 저장하는 것은 너무 위험합니다. 이렇게하면 복구가 불가능하지만 누군가가 암호를 잊거나 잃어 버릴 때 일부 수표를 실행하고 새 비밀번호를 만들 수 있습니다.

다른 팁

선호하는 방법 : DB에 암호를 저장하지 마십시오. 그 해시 만. 맛에 소금을 첨가하십시오.

나는 당신이 묘사 한 것과 똑같은 일을한다. I Base64는 암호화 된 이진 값을 인코딩합니다. 할당 할 공간의 양은 암호화 알고리즘/암호 강도에 따라 다릅니다.

나는 당신이 제대로하고 있다고 생각합니다 (당신이 소금).

  1. 저장 해시의 염-암과 같은 bcrypt(nounce+pwd).수도 있습 bcrypt 이상 또는 MD5SHA1 할 수 있기 때문에 계속될 CPU,따라서 공격 방법이 이상합니다.
  2. 추가 보안문자를 로그인 양식한 후에 몇 가지 오류 로그인(을 방지하 brute-force attacks)
  3. 응용 프로그램의 경우에는"비밀번호를 잊어버렸"링크는지 확인하십시오를 보내지 않는 새로운 암호를 이메일로,그러나 대신에 보내야에 대한 링크(담보)페이지할 수 있도록 정의를 새로운 비밀번호(가능하게 확인 후에 일부의 개인정보를 같은 사용자의 탄생일,예를 들어).또한,응용 프로그램의 경우 사용자가 정하는 새로운 비밀번호 확인을 요구하는 사용자를 확인 현재 비밀번호입니다.
  4. 분명한 안전한 로그인을 양식(일반적으로는 HTTPS)과 서버 자신

으로 이러한 조치는,사용자의 암호가 될 것이 매우 잘 보호에 대하여:

  1. =>오프라인 사전 공격
  2. =>라이브 사전 공격
  3. =>의 서비스 거부 공격
  4. =>모든 종류의 공격!

해시 함수의 결과는 0 ~ 255 범위의 일련의 바이트이므로 (8 비트 데이터 유형의 서명성에 따라 -128 ~ 127), 원시 바이너리 필드로 저장하면 가장 의미가 있습니다. , 그것이 가장 작고 추가 인코딩 및 디코딩 단계가 필요하지 않기 때문에.

일부 데이터베이스 나 드라이버는 이진 데이터 유형을 잘 지원하지 않거나 때로는 개발자가 편안하다고 느끼기에 충분히 익숙하지 않습니다. 이 경우, Base-64 또는 Base-85와 같은 이진-텍스트 인코딩을 사용하고 문자 필드에 결과 텍스트를 저장하는 것이 허용됩니다.

필요한 필드의 크기는 사용하는 해시 기능에 의해 결정됩니다. MD5는 항상 16 바이트를 출력하고 SHA-1은 항상 20 바이트를 출력합니다. 해시 함수를 선택하면 일반적으로 기존 암호를 재설정해야하므로 일반적으로 해시 기능이 고정됩니다. 따라서 가변 크기의 필드를 사용해도 아무것도 구매하지 않습니다.


해싱을 수행하는 "가장 좋은"방법과 관련하여, 나는 그 주제에 대한 다른 질문에 대한 많은 답을 제공하려고 노력했습니다.

나는 사용자 이름의 SHA 해시, 웹 구성의 안내서 및 암호를 Varchar (40)로 저장합니다. 그들이 무차별 인 힘 / 사전을 원한다면 웹 서버를 해킹해야합니다. 사용자 이름은 비밀번호를 찾으면 전체 데이터베이스에서 무지개 테이블을 작성합니다. 사용자가 사용자 이름을 변경하려면 비밀번호를 동시에 재설정합니다.

System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(
    username.ToLower().Trim(),
    ConfigurationManager.AppSettings("salt"),
    password
);

암호의 간단한 해시 또는 (Salt + Password)는 일반적으로 적절하지 않습니다.

보다:

http://www.matasano.com/log/958/enough-with-the-rainbow-tables-what-need-need-to-bnow-password-schemes/

그리고

http://gom-jabbar.org/articles/2008/12/03/why-you-should-use-bcrypt-to--s--passwords

둘 다 BCrypt 알고리즘을 권장합니다. 무료 구현은 가장 인기있는 언어에 대해 온라인으로 찾을 수 있습니다.

데이터베이스에서 여러 해시를 사용할 수 있으므로 약간의 추가 노력이 필요합니다. 미래에 추가 형식을 지원해야 할 가장 먼 기회가 있다고 생각되면 가치가 있습니다. 나는 종종 비밀번호 항목을 사용합니다

{hashid} $ {salt} $ {Hashed Password}

"해시드"는 내부적으로 사용하여 특정 해시 패턴과 함께 SHA1을 사용하고 있습니다. "소금"은베이스 64- 인코딩 된 임의의 소금이다; "Hashed Password"는 Base64에 인코딩 된 해시입니다. 해시를 마이그레이션 해야하는 경우 이전 암호 형식으로 사람을 가로 채고 다음에 로그인 할 때 암호를 변경할 수 있습니다.

다른 사람들이 언급했듯이, 당신은 당신의 해시에주의를 기울이고 싶기 때문에 실제로 안전하지 않은 일을하기가 쉽기 때문에 H (소금, 암호)는 H (암호, 소금)보다 훨씬 약하지만 동시에 원하는 시간에 원합니다. 사이트 컨텐츠의 가치 와이 노력의 균형을 맞추십시오. 나는 종종 H (H (암호, 소금), 비밀번호)를 사용합니다.

마지막으로, Base64- 인코딩 된 암호를 사용하는 비용은 텍스트 데이터를 기대하는 다양한 도구를 사용할 수 있다는 이점과 비교할 때 적당합니다. 예, 그들은 더 유연해야하지만, 레코드 당 몇 바이트를 저장하기 때문에 자신이 좋아하는 타사 도구를 사용할 수 없다고 상사에게 알릴 준비가 되셨습니까? :-)

다른 코멘트를 추가하기 위해 편집 : 각 비밀번호 1/10 초를 불 태우는 알고리즘을 의도적으로 제안했다면 각 비밀번호를 해시 할 수 있습니다. (운이 좋지 않습니까? 그는 다음 연례 리뷰에서 논의하기 위해 무언가를 내려 놓을 것입니다.) 그 시간을 불 태는 것은 수십 명 또는 수백 명의 사용자가있을 때 문제가되지 않습니다. 100K 사용자를 추진하는 경우 일반적으로 여러 사람이 동시에 로그인 할 수 있습니다. 빠르고 강하고 느리고 강하지 않은 것이 필요합니다. "그러나 신용 카드 정보는 어떻습니까?" 저장된 신용 카드 정보는 일반 데이터베이스 근처에 있지 않아야하며 개별 사용자가 아닌 응용 프로그램에 의해 암호화 될 것이기 때문에 기껏해야 불분명합니다.

ASP.NET과 함께 작업하는 경우 내장 멤버십 API를 사용할 수 있습니다.

많은 유형의 스토리지 옵션을 지원합니다. 편도 해시, 양방향 암호화, MD5 + 소금. http://www.asp.net/learn/security 더 많은 정보를 위해서.

너무 멋진 것이 필요하지 않으면 웹 사이트에 좋습니다.

ASP.NET을 사용하지 않는 경우 여기에 4Guys 및 CodeProject의 몇 가지 기사에 대한 좋은 링크가 있습니다.

http://aspnet.4guysfromrolla.com/articles/081705-1.aspx http://aspnet.4guysfromrolla.com/articles/103002-1.aspx http://www.codeproject.com/kb/security/simpleencryption.aspx

귀하의 질문은 스토리지 방법 및 크기에 관한 것이므로이를 해결하겠습니다.

스토리지 유형은 이진 또는 텍스트 표현 일 수 있습니다 (Base64가 가장 일반적입니다). 이진은 작지만 텍스트로 작업하는 것이 더 쉽습니다. 사용자 소금 (비밀번호 당 다른 소금) 당 수행하는 경우 Salt+Hash를 단일 결합 문자열로 보관하는 것이 더 쉽습니다.

크기는 해시 알고리즘에 따라 다릅니다. MD5의 출력은 항상 16 바이트이고 SHA1은 항상 20 바이트입니다. SHA-256 & SHA-512는 각각 32 & 64 바이트입니다. 텍스트 인코딩을 사용하는 경우 인코딩 방법에 따라 약간 더 많은 저장 공간이 필요합니다. 스토리지가 비교적 저렴하기 때문에 Base64를 사용하는 경향이 있습니다. Base64는 대략 33% 더 큰 필드가 필요합니다.

사용자가 소금에 절인 경우 해시를위한 공간이 필요합니다. 64 비트 솔트 + SHA1 해시 (160 비트) Base64 인코딩은 40자를 가져 가서 char (40)로 저장합니다.

마지막으로 제대로하려면 단일 해시를 사용해서는 안되지만 RBKDF2와 같은 주요 파생 기능을 사용해야합니다. SHA1 및 MD5 해시는 미친 듯이 빠릅니다. 단일 스레드 애플리케이션조차도 쿼드 코어 머신에서 초당 최대 200k 암호를 초당 약 30k ~ 50k 암호를 해시 할 수 있습니다. GPU는 초당 많은 암호로 100x에서 1000x를 해시 할 수 있습니다. 해당 무차별 공격과 같은 속도로 허용 가능한 침입 방법이됩니다. RBKDF2를 사용하면 해싱이 "느리게"하는 방법을 미세 조정하기 위해 반복 횟수를 지정할 수 있습니다. 요점은 시스템을 무릎으로 가져 오는 것이 아니라 해시 처리량의 상한을 캡처 할 수 있도록 여러 반복을 선택하는 것입니다 (예 : 초당 500 해시). 향후 증거 방법은 암호 필드에 반복 수를 포함시키는 것입니다 (반복 + Salt + Hash). 이를 통해 향후 반복이 증가하여보다 강력한 프로세서와 보조를 맞출 수 있습니다. 더 유연한 사용을 위해 Varchar는 향후 잠재적으로 더 큰/대체 해시를 허용하기 위해 Varchar를 사용합니다.

.NET 구현은 RFC2892DeriveBytes입니다http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top