본문 바로가기

프로그램/일반 프로그램

PHP 로그인 패스워드 해시 사용을 통한 보안

최신버전 PHP는 로그인 관련해서 해시를 이용해서 사용자가 패스워드 입력하는지 알 수 없도록 설계한다. 

 

PHP에서 패스워드 해시의 원리와 작동 방법, 안전성 등을 점검해 본다. 

 

1. 원리 이해 - 해시

  - 해시라는 것은 암호를 저장하는데 있어서 가장 획기적으로 잘 쓰이는 물건이다. 

어떤 문자, 숫자 등을 입력해서 거기에서 특징적인 값만은 분석해서 특정 위치에 저장한다. 

 

SHA256 해시 - 온라인 SHA256 해시 생성기

 

www.convertstring.com

무슨 말인지 어렵다... ?

 

A, B, C 열쇠가 있다고 가정해 보자. 다 다르게 생겼는데, 한 자물쇠에 전부 맞을 수 있도록 설계를 했다고 해 보자. 아래 영상을 보면, 열쇠의 원리가 이해가 될 것인데, 열쇠는 키 높이를 맞추는 부분만 상관이 있는 것이고, 나머지 빈 공간은 열쇠를 여는데 아무런 영향을 끼치지 않는다. 그러기 때문에, 그 공간에 쓰레기 값들을 채워 놓아 그것을 보고 분석해서 원 값을 유추할 수 없도록 하는 기법이다. 물론 이것도 패턴을 알면 뚫릴 수 있다는 것을 명심해야 한다. 세상에 완벽한 보안은 없다. 

 

여튼... 해시란 한 자물쇠에 맞는 여러 종류의 열쇠를 생성하는 개념이다. 비교적 안전한 방법이다. 

 

간략하게 id와 패스워드의 해시를 저장할 테이블을 생성해 본다. 

패스워드를 원문 그대로 저장하게 되면, 한번 뚫리면 다 뚫리기 때문이다. 

 

CREATE TABLE `ga` (
`no` INT(11) NULL DEFAULT NULL,
`id` VARCHAR(20) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
`pw` VARCHAR(100) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
`ldt` DATETIME NULL DEFAULT NULL
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
;

CREATE TABLE `ga` ( `no` INT(11) NULL DEFAULT NULL, `id` VARCHAR(20) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', `pw` VARCHAR(100) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', `ldt` DATETIME NULL DEFAULT NULL ) COLLATE='utf8_unicode_ci' ENGINE=InnoDB ; 

 

먼저 코드 1차전... id와 패스워드를 받아서 id에 맞는 pw 해시를 불러 와서 password_verify 함수에 넣어서 확인해 보는 방법이다. 

    
<?php 
$pw = $_GET['pw']; 
$id = $_GET['id']; 

$conn = mysqli_connect('localhost', 'db_id', 'db_password', 'db_name');
$sql = 'SELECT pw FROM ga WHERE id = "' . $id . '"';
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($result);
$password_hash = $row['pw'];

if (password_verify($pw, $password_hash)) {
  echo '맞음요';
} else {
  echo '틀림요';
}
?>

 

이런 방법은 위험하다... ^^ 안전한 길을 가르쳐 준다면서, 왜 위험한 것을 보여주냐고? 

일단 get 방식은 파라미터에 id / password를 노출시킨다. 누군가 주변에서 보고 있다면, 바로 세트로 노출될 수 있는 거다. 

 

그럼 어떻게 하면 좋을까?