해시된 비밀번호 필드에 사용할 데이터 유형과 길이는 어떻게 됩니까?
패스워드 해시가 어떻게 기능하는지는 모르지만(나중에 실장할 예정) 지금 데이터베이스 스키마를 작성해야 합니다.
패스워드는 4~20자로 제한하려고 생각하고 있습니다만, 해시 문자열을 암호화한 후 길이가 다르다는 것을 알고 있습니다.
그럼, 이 패스워드를 데이터베이스에 저장하는 방법은 무엇일까요?
업데이트: 단순히 해시 함수를 사용하는 것만으로는 암호를 저장할 수 없습니다.자세한 설명은 이 스레드에 있는 Gilles의 답변을 읽어보십시오.
비밀번호에는 Bcrypt 또는 Argon2i와 같은 키 강화 해시 알고리즘을 사용합니다.예를 들어 PHP에서는 기본적으로 Bcrypt를 사용하는 password_hash() 함수를 사용합니다.
$hash = password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
그 결과 다음과 같은 60글자의 문자열이 생성됩니다(단, 고유 솔트를 생성하기 때문에 숫자는 다릅니다).
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
SQL 을 합니다.CHAR(60)
해시 합니다.이 함수는 16진수의 문자열로 인코딩되지 않기 때문에 이진수로 저장하기 위해 쉽게 해제를 할 수 없습니다.
다른 해시함수는 아직 쓰임새가 있지만 패스워드를 저장할 수 없기 때문에 2008년에 작성된 원답은 그대로 두겠습니다.
사용하는 해시 알고리즘에 따라 달라집니다.해싱은 입력에 관계없이 항상 같은 길이의 결과를 생성합니다.일반적으로 이진 해시 결과를 텍스트로 16진수로 나타냅니다.또는 함수를 사용하여 16진수 문자열을 절반으로 줄일 수 있습니다.
- MD5는 128비트 해시값을 생성합니다.CHAR(32) 또는 BINARY(16)를 사용할 수 있습니다.
- SHA-1은 160비트 해시값을 생성합니다.CHAR(40) 또는 BINARY(20)를 사용할 수 있습니다.
- SHA-224는 224비트 해시값을 생성합니다.CHAR(56) 또는 BINARY(28)를 사용할 수 있습니다.
- SHA-256은 256비트 해시값을 생성합니다.CHAR(64) 또는 BINARY(32)를 사용할 수 있습니다.
- SHA-384는 384비트 해시값을 생성합니다.CHAR(96) 또는 BINARY(48)를 사용할 수 있습니다.
- SHA-512는 512비트 해시값을 생성합니다.CHAR(128) 또는 BINARY(64)를 사용할 수 있습니다.
- BCrypt는 구현에 의존하는 448비트 해시 값을 생성합니다.CHAR(56), CHAR(60), CHAR(76), BINARY(56) 또는 BINARY(60)가 필요할 수 있습니다.
2015년 현재 NIST는 상호 운용성이 필요한 해시 함수 애플리케이션에 SHA-256 이상을 사용할 것을 권장합니다.그러나 NIST는 암호를 안전하게 저장하기 위해 이러한 간단한 해시 함수를 사용하는 것을 권장하지 않습니다.
작은 해시 알고리즘은 (어플리케이션의 내부나 교환용이 아닌) 용도가 있지만 크래킹이 가능한 것으로 알려져 있습니다.
항상 암호 해시 알고리즘을 사용합니다.Argon2, 스크립트, bcrypt 또는 PBKDF2.
2015년 패스워드 해싱 대회에서 Argon2가 우승했습니다.Scrypt, bcrypt 및 PBKDF2는 현재 선호도가 낮은 오래된 알고리즘이지만 기본적으로는 건전하기 때문에 플랫폼이 아직 Argon2를 지원하지 않는 경우에는 다른 알고리즘을 사용해도 괜찮습니다.
비밀번호를 데이터베이스에 직접 저장하지 마십시오.암호화하지 마십시오. 암호화하지 않으면 사이트가 침해되면 공격자가 암호 해독 키를 얻어서 모든 암호를 얻을 수 있습니다.패스워드는 해시해야 합니다.
암호 해시는 해시 테이블 해시 또는 암호화 해시와는 다른 속성을 가집니다.MD5, SHA-256, SHA-512 등의 일반 암호화 해시를 비밀번호에 사용하지 마십시오.비밀번호 해시 알고리즘은 솔트를 사용합니다(다른 사용자나 다른 사용자의 데이터베이스에는 사용되지 않음).salt는 공격자가 일반적인 패스워드의 해시만 미리 계산할 수 있도록 하기 위해 필요합니다.salt를 사용하면 모든 계정에 대해 계산을 다시 시작해야 합니다.패스워드 해싱 알고리즘은 본질적으로 느립니다.가능한 한 느립니다.공격자는 여러 가지 암호를 시도해야 하므로 속도가 느리면 공격자에게 사용자보다 훨씬 더 큰 피해를 줍니다.자세한 내용은 암호를 안전하게 해시하는 방법을 참조하십시오.
패스워드 해시는 4개의 정보를 부호화합니다.
- 어떤 알고리즘이 사용되고 있는지를 나타내는 인디케이터.이는 민첩성을 위해 필요합니다.암호화에 관한 권장사항은 시간이 지남에 따라 달라집니다.새로운 알고리즘으로 전환할 수 있어야 합니다.
- 난이도 또는 경도 표시기.이 값이 클수록 해시를 계산하는 데 더 많은 계산이 필요합니다.이 값은 비밀번호 변경 함수의 상수 또는 글로벌 구성 값이어야 하지만 컴퓨터의 속도가 빨라짐에 따라 시간이 지남에 따라 증가하므로 각 계정의 값을 기억해야 합니다.1개의 수치를 가지는 알고리즘도 있고, 더 많은 파라미터를 가지는 알고리즘도 있습니다(예를 들어 CPU 사용량과 RAM 사용률을 개별적으로 조정하는 알고리즘).
- The salt. Since the salt must be globally unique, it has to be stored for each account. The salt should be generated randomly on each password change.
- The hash proper, i.e. the output of the mathematical calculation in the hashing algorithm.
Many libraries include a pair functions that conveniently packages this information as a single string: one that takes the algorithm indicator, the hardness indicator and the password, generates a random salt and returns the full hash string; and one that takes a password and the full hash string as input and returns a boolean indicating whether the password was correct. There's no universal standard, but a common encoding is
$algorithm$parameters$salt$output
어디에algorithm
는 알고리즘의 선택을 부호화하는 숫자 또는 짧은 영숫자 문자열입니다.parameters
인쇄 가능한 문자열입니다.salt
그리고.output
Base64 로 부호화되어 있습니다.=
.
16바이트는 salt와 출력에 충분합니다.(예를 들어 Argon2의 권장 사항을 참조하십시오).Base64로 인코딩되어 각각 21자씩입니다.다른 두 부분은 알고리즘과 파라미터에 따라 다르지만 일반적으로 20~40자의 문자가 사용됩니다.합계 약 82자의 ASCII 문자(CHAR(82)
Unicode가 필요 없음)을 참조하십시오.나중에 필드를 확대하는 것이 어려울 것 같으면 여기에 안전 마진을 추가해야 합니다.
해시를 바이너리 형식으로 부호화하면 알고리즘의 경우 1바이트, 경도의 경우 1~4바이트(일부 파라미터의 하드코드의 경우), 솔트와 출력의 경우 각각 16바이트로 합계 37바이트가 됩니다.Say 40 bytes )BINARY(40)
최소 몇 개의 스페어 바이트가 있어야 합니다.8비트 바이트로 인쇄 불가능한 문자입니다.특히 필드에 늘바이트를 포함할 수 있습니다.
Note that the length of the hash is completely unrelated to the length of the password.
실제로 사용할 수 있습니다.CHAR
(해시 길이) 각 해시 알고리즘은 항상 동일한 수의 문자로 평가되므로 MySQL에 대한 데이터 유형을 정의합니다.예를들면,SHA1
는, 항상 40 문자의 16 진수를 반환합니다.
You might find this Wikipedia article on salting worthwhile. The idea is to add a set bit of data to randomize your hash value; this will protect your passwords from dictionary attacks if someone gets unauthorized access to the password hashes.
고정 길이 문자열(VARCHAR(n) 또는 MySQL이 호출하는 경우).해시에는 (사용하는 해시 알고리즘에 따라) 항상 12자의 고정 길이가 있습니다.따라서 20글자의 패스워드는 12글자의 해시로 감소하고 4글자의 패스워드는 12글자의 해시를 생성합니다.
하면 됩니다.TEXT
(문자 수 제한 없음)는, 순방향의 호환성을 위해서 사용합니다.해시 알고리즘(필요)은 시간이 지남에 따라 강화되므로 이 데이터베이스 필드는 시간이 지남에 따라 더 많은 문자를 지원해야 합니다.또한 이행전략에 따라서는 새로운 해시와 오래된 해시를 같은 필드에 저장해야 할 수 있으므로 길이를 한 유형의 해시에 고정하는 것은 권장하지 않습니다.
해시는 일련의 비트(알고리즘에 따라 128비트, 160비트, 256비트 등)입니다.MySQL이 타입이 타입이어야 Server MySQL).binary(n)
★★★★★★★★★★★★★★★★★」varbinary(n)
에도 소금을 해시에도 소금을 뿌려야 합니다.소금은 텍스트 또는 이진수일 수 있으며 해당 열이 필요합니다.
실제로 사용하는 해시 알고리즘에 따라 달라집니다.패스워드의 길이는 해시의 길이와는 거의 관계가 없는 것으로 기억합니다.사용 중인 해시 알고리즘의 사양을 찾아 몇 가지 테스트를 수행한 후 바로 위에서 잘라냅니다.
암호화된 문자열의 MAX 문자열 길이를 찾아 VARCHAR 유형의 문자 길이로 설정하기 위해 항상 테스트해 왔습니다.보유하는 레코드의 수에 따라서는, 데이타베이스 사이즈에 큰 도움이 됩니다.
md5 vARCHAR(32)가 적절합니다.AES를 사용하는 사용자는 바이너리를 사용하는 것이 좋습니다.
언급URL : https://stackoverflow.com/questions/247304/what-data-type-to-use-for-hashed-password-field-and-what-length
'source' 카테고리의 다른 글
대소문자를 구분하지 않음 (0) | 2022.11.25 |
---|---|
사육사의 실제 사용 (0) | 2022.11.25 |
리액트 한 JSX: 선택한: 선택한 JSX: ""리액트 한 JSX: 선택한: 선택한 JSX: ""리액트 한 JSX: 선택한: 선택한 JSX: "" (0) | 2022.11.16 |
날짜/시간 값을 문자열로 변환 (0) | 2022.11.16 |
MariaDB 영구 변수 설정 (0) | 2022.11.16 |