데이터베이스에 암호를 저장하는 기본 방법
데이터베이스에 암호를 저장하기 위해 선호하는 방법/데이터 유형은 무엇입니까(가능하면 SQL Server 2005).제가 여러 애플리케이션에서 이 작업을 수행하는 방법은 먼저 를 사용하는 것입니다.NET 암호화 라이브러리를 바이너리(16)로 데이터베이스에 저장합니다.이 방법이 선호됩니까? 아니면 다른 데이터 유형을 사용하거나 16개 이상의 공간을 할당해야 합니까?
저는 데이터베이스에 암호와 동등한 염가 해시를 저장하고 암호 자체를 저장하지 않으며 항상 생성된 해시와 사용자가 전달한 해시를 비교합니다.
문자 그대로의 암호 데이터를 어디에나 저장하는 것은 너무 위험합니다.이렇게 하면 복구가 불가능하지만 다른 사용자가 암호를 잊어버리거나 분실한 경우 몇 가지 검사를 실행하여 새 암호를 만들 수 있습니다.
선호하는 방법은 비밀번호를 DB에 저장하지 않는 것입니다.해시만.맛에 소금을 첨가하세요.
String으로 저장되는 것을 제외하고는 당신이 설명한 것과 동일한 작업을 수행합니다.I Base64는 암호화된 이진 값을 인코딩합니다.할당할 공간의 양은 암호화 알고리즘/암호 강도에 따라 달라집니다.
당신이 솔트를 사용하는 것을 고려할 때, 저는 당신이 그것을 올바르게 하고 있다고 생각합니다.
- bcrypt(nounce+pwd)와 같은 salted-password의 해시를 저장합니다.CPU 집약적으로 조정할 수 있으므로 SHA1 또는 MD5보다 암호화를 선호할 수 있으므로 무차별 공격이 훨씬 길어질 수 있습니다.
- 로그인 오류가 몇 번 발생한 후 로그인 양식에 캡차를 추가합니다(브루트 포스 공격을 방지
- 응용 프로그램에 "내 암호 확인" 링크가 있으면 새 암호를 전자 메일로 보내지 않고 사용자가 새 암호를 정의할 수 있는 (보안된) 페이지에 대한 링크를 보내야 합니다(예: 사용자의 생년월일과 같은 일부 개인 정보를 확인한 후에만 표시됨).또한 응용프로그램에서 사용자가 새 암호를 정의할 수 있도록 허용하는 경우 사용자에게 현재 암호를 확인하도록 요구해야 합니다.
- 로그인 양식(일반적으로 HTTPS)과 서버 자체를 보호합니다.
이러한 조치를 통해 사용자의 암호는 다음에 대해 상당히 잘 보호됩니다.
- => 오프라인 사전 공격
- => 실시간 사전 공격
- => 서비스 거부 공격
- => 온갖 공격!
해시 함수의 결과는 0 ~ 255(또는 8비트 데이터 유형의 서명 여부에 따라 -128 ~ 127) 범위의 바이트이므로 원시 이진 필드로 저장하는 것이 가장 적합합니다. 가장 간결한 표현이며 추가 인코딩 및 디코딩 단계가 필요하지 않기 때문입니다.
일부 데이터베이스 또는 드라이버는 이진 데이터 유형을 크게 지원하지 않거나, 개발자가 이진 데이터 유형에 익숙하지 않아 불편함을 느낄 수 있습니다.이 경우 Base-64 또는 Base-85와 같은 이진-텍스트 인코딩을 사용하고 결과 텍스트를 문자 필드에 저장할 수 있습니다.
필요한 필드의 크기는 사용하는 해시 함수에 따라 결정됩니다.MD5는 항상 16바이트를 출력하고 SHA-1은 항상 20바이트를 출력합니다.해시 함수를 선택하면 모든 기존 암호를 재설정해야 하므로 일반적으로 해시 함수가 계속 사용됩니다.따라서, 가변 크기의 필드를 사용하는 것은 여러분에게 아무것도 주지 않습니다.
해시를 수행하는 "최상의" 방법과 관련하여 저는 해당 주제에 대한 다른 SO 질문에 많은 답변을 제공하려고 노력했습니다.
저는 varchar(40)로 저장된 사용자 이름, 웹 구성의 guid 및 암호의 sha hash를 사용합니다.만약 그들이 무차별적인 사전을 원한다면 그들은 가이드를 위해 웹 서버도 해킹해야 할 것입니다.사용자 이름은 암호를 찾을 경우 전체 데이터베이스에 걸쳐 무지개 테이블을 만드는 과정에서 중단됩니다.사용자가 사용자 이름을 변경하려면 비밀번호를 동시에 재설정합니다.
System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(
username.ToLower().Trim(),
ConfigurationManager.AppSettings("salt"),
password
);
일반적으로 단순한 암호 해시 또는 짝수(salt + 암호)는 적합하지 않습니다.
참조:
그리고.
http://gom-jabbar.org/articles/2008/12/03/why-you-should-use-bcrypt-to-store-your-passwords
둘 다 암호화 알고리즘을 권장합니다.대부분의 인기 언어에 대한 무료 구현은 온라인에서 찾을 수 있습니다.
데이터베이스에서 여러 개의 해시를 사용할 수 있습니다. 약간의 추가 작업만 필요합니다.하지만 앞으로 추가 형식을 지원해야 할 가능성이 가장 크다고 생각한다면 충분히 가치가 있습니다.다음과 같은 암호 항목을 자주 사용합니다.
{hashId}${salt}${해시된 암호}
여기서 "hashId"는 특정 해시 패턴을 가진 SHA1을 사용하고 있으며, "salt"는 기본 64 인코딩 랜덤 소금이고, "hashed password"는 기본 64 인코딩 해시입니다.해시를 마이그레이트해야 하는 경우 이전 비밀번호 형식의 사용자를 가로채서 다음에 로그인할 때 비밀번호를 변경하도록 할 수 있습니다.
다른 사람들이 언급했듯이, 실제로 안전하지 않은 것을 하기가 쉬우므로 해시를 조심해야 합니다. 예를 들어 H(소금, 암호)는 H(암호, 소금)보다 훨씬 약하지만 동시에 이 작업에 투입되는 노력과 사이트 콘텐츠의 가치 사이에서 균형을 유지해야 합니다.저는 H(H(비밀번호, 소금), 비밀번호)를 자주 사용할 것입니다.
마지막으로, 텍스트 데이터를 예상하는 다양한 도구를 사용할 수 있다는 이점에 비해 Base64 인코딩 암호를 사용하는 비용은 적습니다.네, 좀 더 유연해야 하지만, 레코드당 몇 바이트를 절약하고 싶기 때문에 상사가 좋아하는 타사 도구를 사용할 수 없다고 말할 준비가 되셨습니까? :-)
다른 의견을 추가하기 위해 편집: 만약 내가 각 비밀번호를 해싱하는 1/10초라도 태우는 알고리즘을 의도적으로 사용할 것을 제안한다면 나는 운 좋게도 상사의 사무실에서 웃음거리가 될 것입니다.(그렇게 운이 좋지 않아요?그는 제 다음 연례 리뷰에서 논의할 내용을 적어 두곤 했습니다.)사용자 수가 수십 명 또는 수백 명에 이를 때는 그 시간을 태우는 것이 문제가 되지 않습니다.10만 명의 사용자를 푸시하는 경우 일반적으로 여러 명이 동시에 로그인합니다.당신은 느리고 강한 것이 아니라 빠르고 강한 것이 필요합니다.저장된 신용카드 정보가 일반 데이터베이스 근처에 있으면 안 되며, 개별 사용자가 아닌 응용프로그램에 의해 암호화되기 때문에 "신용카드 정보는 어떻게 해야 합니까?"라는 질문은 기껏해야 솔직하지 않습니다.
ASP로 작업하는 경우.넷 내장된 멤버십 API를 사용할 수 있습니다.
단방향 해시, 양방향 암호화, md5 + salt 등 다양한 유형의 스토리지 옵션을 지원합니다.자세한 내용은 http://www.asp.net/learn/security 를 참조하십시오.
만약 당신이 너무 화려한 것이 필요하지 않다면, 이것은 웹사이트에 좋습니다.
ASP를 사용하지 않는 경우.넷 여기 4명의 남자와 코드 프로젝트의 몇 가지 기사에 대한 좋은 링크가 있습니다.
https://web.archive.org/web/20210519000117/http ://aspnet.4guysfromrolla.com/articles/081705-1.aspx https://web.archive.org/web/20210510025422/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% 더 큰 필드가 필요합니다.
사용자별 솔팅이 있는 경우 해시 공간도 필요합니다.64bit salt + SHA1 hash (160bit) base64 encoded를 합하면 40자가 소요되므로 char(40)로 저장합니다.
마지막으로 제대로 하려면 단일 해시를 사용하지 말고 RBKDF2와 같은 키 파생 함수를 사용해야 합니다.SHA1 및 MD5 해시는 엄청나게 빠릅니다.단일 스레드 애플리케이션도 쿼드코어 시스템에서 초당 최대 20만 개의 암호를 초당 약 30K에서 50K의 암호를 해시할 수 있습니다.GPU는 초당 100배에서 1000배의 암호를 해시할 수 있습니다.그런 속도라면 무차별 공격이 허용되는 침입 방법이 됩니다.RBKDF2를 사용하면 해시의 "느림" 정도를 미세 조정하기 위해 반복 횟수를 지정할 수 있습니다.요점은 시스템을 굴복시키는 것이 아니라 해시 처리량의 상한선(예: 초당 500개의 해시)을 초과할 수 있도록 여러 번의 반복을 선택하는 것입니다.향후 증명 방법은 암호 필드(반복 + 소금 + 해시)에 반복 횟수를 포함하는 것입니다.이를 통해 향후 더 많은 반복 작업을 통해 더 강력한 프로세서와 보조를 맞출 수 있습니다.보다 유연하게 사용하려면 varchar를 사용하여 향후 더 큰/대체 해시를 사용할 수 있습니다.
.Net 구현은 RFC2892DeriveBytes http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx 입니다.
언급URL : https://stackoverflow.com/questions/615704/preferred-method-of-storing-passwords-in-database
'programing' 카테고리의 다른 글
C에서 가장 높은 순서 비트 찾기 (0) | 2023.07.20 |
---|---|
Firebase에서 확인 이메일을 보내는 방법은 무엇입니까? (0) | 2023.07.20 |
다른 스키마에 있는 DBLINK를 사용하여 Oracle에서 선택하는 방법은 무엇입니까? (0) | 2023.07.20 |
임시 테이블이 있는 경우 해당 테이블 삭제 (0) | 2023.07.20 |
저장된 R 객체를 새 객체 이름으로 로드할 수 있습니까? (0) | 2023.07.20 |