데이터베이스에 암호를 저장하는 가장 좋은 방법
인증(사용자 이름 및 비밀번호)이 있어야 하는 프로젝트를 진행하고 있습니다.
데이터베이스에도 연결이 되기 때문에 사용자 이름과 비밀번호를 저장해야겠다고 생각했습니다.그러나 데이터베이스에 있는 테이블에 있는 텍스트 필드만 암호를 갖는 것은 그다지 좋은 생각이 아닌 것 같습니다.
저는 C#를 사용하고 있으며 2008년 익스프레스 서버에 접속하고 있습니다.이러한 유형의 데이터를 저장하는 가장 좋은 방법이 무엇인지 (가능한 많은 예를 들어) 제안해 줄 수 있는 사람이 있습니까?
추신: 정당한 이유가 제공될 수 있다면 이 정보는 데이터베이스에 저장되지 않는다는 의견에 열려 있습니다.
암호를 일반 텍스트 필드에 저장하는 것은 끔찍한 생각이라는 당신의 말이 맞습니다.그러나 위치에 관한 한 암호 표현을 데이터베이스에 저장하는 것은 대부분의 경우(그리고 솔직히 반대 사례는 생각할 수 없습니다) 적절한 작업입니다.표현하면 salt(사용자마다 달라야 함)와 보안 1방향 알고리즘을 사용하여 암호를 해시하고 원래 암호를 버리고 저장하려는 것입니다.그런 다음 암호를 확인하려는 경우 동일한 해싱 알고리즘과 salt를 사용하여 값을 해쉬하고 데이터베이스의 해쉬 값과 비교합니다.
그래서 여러분이 이 문제에 대해 생각하는 것은 좋은 일이고 좋은 질문이기도 하지만, 이것은 사실 다음과 같은 질문들의 중복입니다. (적어도)
- 사용자 정보와 사용자 로그인 및 비밀번호를 가장 잘 저장하는 방법
- 데이터베이스 암호 저장 모범 사례
- 비밀번호 솔팅: 모범 사례?
- pp 변수 또는 pp 상수에 암호를 평문으로 저장해도 괜찮습니까?
솔팅 비트에 대해 좀 더 명확히 설명하자면, 단순히 암호를 해싱하고 저장하는 것만으로 위험한 것은 침입자가 데이터베이스를 손에 넣더라도 (적어도 무지개 테이블에 나타나는) 여전히 무지개 테이블이라고 알려진 것을 사용하여 암호를 "해독"할 수 있다는 것입니다.이 문제를 해결하기 위해 개발자들은 적절하게 실행되었을 때 무지개 공격을 단순히 실행할 수 없게 만드는 비밀번호에 소금을 첨가합니다.일반적인 오해는 모든 암호에 동일한 고유하고 긴 문자열을 단순히 추가하는 것입니다. 이는 끔찍하지는 않지만, 모든 암호에 고유한 염을 추가하는 것이 가장 좋습니다.자세한 내용은 이 글을 읽어보세요.
배경 당신은 절대로... 정말로...사용자의 비밀번호를 알아야 합니다.들어오는 사용자가 계정의 암호를 알고 있는지 확인하려는 것뿐입니다.
해시 잇 : 강력한 해시 함수를 통해 사용자 비밀번호를 해시(단방향 암호화) 저장합니다."c#암호화 비밀번호" 검색은 많은 예를 제공합니다.
해시 함수가 무엇을 생성하는지에 대한 아이디어는 온라인 SHA1 해시 생성기를 참조하십시오(그러나 SHA1을 해시 함수로 사용하지 말고 SHA256과 같은 더 강력한 것을 사용하십시오).
이제 해시된 암호는 사용자와 데이터베이스 도둑이 해시를 원래 암호로 되돌릴 수 없음을 의미합니다.
사용 방법: 데이터베이스에 저장된 이 매쉬업 암호를 어떻게 사용해야 합니까?
사용자가 로그인하면 사용자 이름과 암호(원문 텍스트)를 제공합니다. 저장된 버전을 얻기 위해 입력된 암호를 해시하는 데 동일한 해시 코드를 사용하면 됩니다.
따라서 해시된 두 개의 암호(사용자 이름에 대한 데이터베이스 해시와 입력된 & 해시된 암호)를 비교합니다.해시를 비교하면 "입력한 내용"이 "원래 사용자가 암호로 입력한 내용"과 일치하는지 알 수 있습니다.
추가 크레딧:
질문:당신의 데이터베이스를 가지고 있다면, 나는 그냥 존 더 리퍼 같은 크래커를 가지고 당신이 저장하고 있는 해시 암호와 일치하는 것을 찾을 때까지 해시를 만들기 시작할 수 없을까요?(어쨌든 사용자가 짧은 사전 단어를 선택하기 때문에...쉬워야 함)
답변: 예...네, 할 수 있습니다.
그래서 당신은 비밀번호를 '솔트' 해야 합니다.소금에 관한 위키피디아 기사 보기
"소금으로 데이터를 해시하는 방법" C# 예제(보관) 참조
sha-512와 같은 안전한 알고리즘을 사용하여 키를 강화한 solted hash.
가장 좋은 보안 방법은 암호를 전혀 저장하지 않고(암호화되지도 않음), 암호화된 암호의 소금에 절인 해시(암호당 고유한 소금 포함)를 저장하는 것입니다.
이렇게 하면 일반 텍스트 암호를 검색하는 것이 사실상 불가능합니다.
'무지개 테이블로 충분해'라는 기사를 읽는 것을 전적으로 권장합니다. 보안 암호 체계에 대해 알아야 할 사항 [dead link, copy at the Internet Archive] 및 암호를 안전하게 저장하는 방법.
저를 포함한 많은 코더들은 보안과 해싱을 이해한다고 생각합니다.애석하게도 우리 대부분은 그렇지 않습니다.
사용자 이름과 비밀번호의 필요성을 언급하신 것처럼 다소 주제가 틀릴 수도 있고, 문제에 대한 제 이해는 최선은 아니지만 열린 상태입니다.생각해 볼 만한 것이 있습니까?
오픈을 사용하는 경우그러면 기술을 제대로 이해하고 있고 사용자가 이미 가지고 있는 자격 증명을 사용할 수 있으므로 응용 프로그램에 특정한 새 ID를 생성할 필요가 없습니다.
문제가 된 애플리케이션이 순수하게 내부용인 경우에는 적합하지 않을 수 있습니다.
RPX는 Open을 쉽게 통합할 수 있는 좋은 방법을 제공합니다.응용프로그램에 ID를 지원합니다.
시나리오에서는 asp.net 구성원 자격을 확인할 수 있습니다. 사용자의 암호를 해시 문자열로 데이터베이스에 저장하는 것이 좋습니다.해시된 들어오는 암호와 데이터베이스에 저장된 암호를 비교하여 사용자를 인증할 수 있습니다.
모든 것이 이 목적을 위해 만들어졌습니다. asp.net 멤버십을 확인해 보세요.
해시를 되돌릴 필요가 없다면 저는 MD5/SHA1 비밀번호를 알려드리겠습니다.사용자가 로그인할 때 주어진 암호만 암호화하고 해시와 비교하면 됩니다.이 경우 해시 충돌은 데이터베이스에 대한 액세스 권한을 얻고 이미 충돌이 발생한 해시를 보지 않는 한 거의 불가능합니다.
언급URL : https://stackoverflow.com/questions/1054022/best-way-to-store-password-in-database
'programing' 카테고리의 다른 글
angularjs에서 배열 푸시의 중복을 방지하는 방법 (0) | 2023.10.26 |
---|---|
Woocommerce: html 출력을 대체하는 데 도움 (0) | 2023.10.26 |
pHPUnit에서 clover.xml을 생성할 때 상대 경로를 정의하시겠습니까? (0) | 2023.10.26 |
MariaDB Galera 클러스터가 동기화되고 있지 않습니다. (0) | 2023.10.26 |
매개 변수가 포함된 Swift GET 요청 (0) | 2023.10.26 |