티스토리 뷰
MySQL 5.7 Reference Manual 의 13.13 Encryption and Compression Functions 발췌:
Many encryption and compression functions return strings for which the result might contain arbitrary byte values. If you want to store these results, use a column with aVARBINARY
orBLOB
binary string data type. This will avoid potential problems with trailing space removal or character set conversion that would change data values, such as may occur if you use a nonbinary string data type (CHAR
,VARCHAR
,TEXT
).
대부분의 암호화/압축 함수는 임의의 바이트 값으로 이루어진 문자열을 반환합니다. 이러한 결과를 저장하고 싶다면 열의 자료형을 varbinary 혹은 blob로 설정하여 발생할 수 있는 문제들―문자열 내 공란의 제거 혹은 데이터 값의 문자셋 변환으로 야기되는―을 예방할 수 있습니다. 그러한 문제들은 非바이너리 문자열 자료형(char, varchar, text)에서 발생할 수 있습니다.
사용 중인 PHP 버전이 5.5.0 이상일 경우 PHP는 password_hash 함수와 password_verify 함수를 네이티브로 제공합니다.
password_hash 함수는 순서대로 (문자열 암호, 상수 알고리즘, [, 그외 옵션]) 인자를 받지만, 지금은 아기단계mild이기 때문에 옵션 부분은 무시하도록 합시다. PHP.net의 함수 레퍼런스에 따르면 알고리즘 부분은 PASSWORD_DEFAULT 혹은 PASSWORD_BCRYPT를 입력할 수 있다고 하며, PHP의 업데이트에 따라 PASSWORD_DEFAULT로 설정 시의 알고리즘이 변경될 수 있으니(게다가 이에 따른 다이제스트―결과 값의 길이가 변환될 수 있다고 하니), 역시 아기단계mild인 나는 PASSWORD_BCRYPT를 사용하도록 합니다.
$hashed_password = password_hash($password, PASSWORD_BCRYPT); 이런 식으로 사용합니다.
매뉴얼에 의하면 기본 설정의 password_hash 함수는 실행 후 결과 값을 반환하는 데에 약 100ms의 시간이 소비된다고 합니다. 이러한 느린 수행 시간은 성능을 희생하고 보안을 강화합니다. 간단한 테스트 페이지로 실험해 보니 말 그대로 입니다. 10번을 반복 수행하니 역시나 페이지가 로딩되는 데에 1초 남짓의 시간이 걸렸습니다. 이상한 점은 매 실행 시 다이제스트 값이 다르다는 점 입니다. 그래서 password_verify 함수가 필요합니다.
password_verify는 이를테면 웹 페이지에서 입력 받은 문자열 $password와 (이를테면) 데이터베이스에서 꺼내 온 문자열 $hash를 비교하여 부울 값을 반환합니다. 아까는 매 실행 시 다이제스트 값이 다르다고 하였는데, 그 때에 입력하였던 문자열 비밀번호와 이 다이제스트 값을 가지고 password_verify를 수행하니 하나도 빠짐없이 true가 출력됩니다. 당분간은 솔트 같은 것은 생각하지 않아도 좋을 것 같아 좋습니다.
PASSWORD_BCRYPT 알고리즘의 password_hash 함수의 결과 값은 전부 60byte의 문자열을 반환하였습니다. 이제 계정 테이블의 비밀번호 열은 자료형을 binary(60)으로 설정하면 되겠습니다.
'Note' 카테고리의 다른 글
MongoDB - Enable Auth (0) | 2016.12.26 |
---|---|
var, let, const (0) | 2016.07.09 |
한 글자 HTML 요소 : b (0) | 2016.05.13 |
한 글자 HTML 요소 목록 (0) | 2016.05.10 |
한 글자 HTML 요소 : a (0) | 2016.05.10 |