본문 바로가기

php/코드이그나이터(CI3)

php 암호화

반응형

양방향 암호화

기존 양방향 암호화 알고리즘으로 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