양방향 암호화
기존 양방향 암호화 알고리즘으로 openssl_encrypt를 사용했었다.
//암호화
function encrypt($str, $key='') {
if (!$key)
return "";
return base64_encode(openssl_encrypt($str, "AES-256-CBC", $key, true, str_repeat(chr(0), 16)));
}
//복호화
function decrypt($str, $key='') {
if (!$key)
return "";
return openssl_decrypt(base64_decode($str), "AES-256-CBC", $key, true, str_repeat(chr(0), 16));
}
그런데 패스워드에는 단방향 암호화를 적용해야한다해서... 찾아봤다.
단방향암호화
알고있는 MD5 사용하려고했더니 충돌가능성, 보안취약성 때문에 별로라고 하더라...
그래서 SHA-256 알고리즘을 사용하려다가 Argon2 를 추천받아서 사용해보기로했다.
php 7.2 이상에서 password_hash() 함수에서 옵션을 통해 지원한다고한다.
//password_hash ( string $password , int $algo [, array $options ] )
$options_argon = [
'memory_cost' => 1 << 17, // 128MB
'time_cost' => 4,
'threads' => 3,
];
//해쉬값 설정한 pwd
$hashed_password_argon = password_hash($f_passwd_new, PASSWORD_ARGON2I, $options_argon);
$options_bcypt = [
'cost' => 12, // 비용 설정 (숫자가 클수록 더 복잡한 암호화)
];
//bcrypt 알고리즘 내부적으로 salt 가 설정되어서 굳이 설정안해줘도 된다
$hashed_password_bcrypt = password_hash($password, PASSWORD_BCRYPT, $options_bcypt);
$hashed_password_default = password_hash($f_passwd_new, PASSWORD_DEFAULT);
작성한것과 같이 사용하면된다
$password
암호화할 문자열입니다.
$algo
암호화 알고리즘을 정합니다.
- PASSWORD_DEFAULT : bcrypt 알고리즘을 사용합니다.
- PASSWORD_BCRYPT : CRYPT_BLOWFISH 알고리즘을 사용합니다.
- PASSWORD_ARGON2I : Argon2i hashing 알고리즘을 사용합니다. PHP를 Argon2를 사용할 수 있도록 설치한 경우에 사용 가능합니다.
- PASSWORD_ARGON2ID : Argon2id hashing 알고리즘을 사용합니다. PHP를 Argon2를 사용할 수 있도록 설치한 경우에 사용 가능합니다.
$options
알고리즘을 PASSWORD_BCRYPT로 정했을 때 사용 가능한 옵션은 다음과 같습니다.
- salt (string)
- cost (integer)
알고리즘을 PASSWORD_ARGON2I 또는 PASSWORD_ARGON2ID로 정했을 때 사용 가능한 옵션은 다음과 같습니다.
- memory_cost (integer)
- time_cost (integer)
- threads (integer)
salt 는 무작위 대입방법에 대한 대비책이라고 보면된다. 요리할때 소금친다? 에서 나온것으로 알고있다.
PASSWORD_ARGON2I 으로 사용할랬더니 PHP버전호환이 안되나보다.
그래서 차선책으로 PASSWORD_DEFAULT 을 사용하였다.
PASSWORD_DEFAULT 은 PHP버전에 자동으로 최적화된 암호화 알고리즘을 선택해주는 옵션이라고 한다.
단방향암호화 검증
단방향 암호화를 하고 나서 해당 패스워드가 맞는지 로그인시 확인하는코드이다.
$hashed_password = '$2y$10$...'; // 데이터베이스에서 가져온 암호화된 비밀번호
if (password_verify($input_password, $hashed_password)) {
// 비밀번호 일치
} else {
// 비밀번호 불일치
}
password_verify() 함수는 password_hash() 로 암호화할때 포함된 salt값을 추출하여 사용자가 입력한 비밀번호를 검증해준다.
'php > 코드이그나이터(CI3)' 카테고리의 다른 글
php 오라클 date 타입 형식 변경 (0) | 2024.05.12 |
---|---|
php/java view생성 후 ajax리턴 (0) | 2024.05.12 |
파일다운로드 (0) | 2024.05.12 |
파일업로드 (0) | 2024.05.12 |
php exec 실행안될때 확인 (0) | 2024.05.12 |