암호화 저장 모델

SSL/SSH는 클라이언트에서 서버로 이동하는 데이터를 보호합니다. SSL/SSH는 데이터베이스에 저장된 영구 데이터를 보호하지 않습니다. SSL은 on-the-wire 프로토콜입니다.

공격자가 웹 서버를 우회하여 데이터베이스에 직접 액세스하면 정보가 데이터베이스 자체에서 보호되지 않는 한 저장된 민감한 데이터가 노출되거나 오용될 수 있습니다. 데이터 암호화는 이 위협을 완화하는 좋은 방법이지만 이러한 유형의 데이터 암호화를 제공하는 데이터베이스는 거의 없습니다.

이 문제를 해결하는 가장 쉬운 방법은 먼저 고유한 암호화 패키지를 만든 다음 PHP 스크립트 내에서 사용하는 것입니다. PHP는 다양한 암호화 알고리즘을 다루는 OpenSSLSodium과 같은 여러 확장을 통해 이를 지원할 수 있습니다. 스크립트는 데이터를 데이터베이스에 삽입하기 전에 암호화하고 검색할 때 암호를 해독합니다. 암호화 작동 방식에 대한 추가 예는 참조를 참조하십시오.


Hashing

진정으로 숨겨진 데이터의 경우 원시 표현이 필요하지 않은 경우(즉, 표시되지 않음) 해싱을 고려해야 합니다. 해싱에 대한 잘 알려진 예는 비밀번호 자체가 아닌 데이터베이스에 비밀번호의 암호화 해시를 저장하는 것입니다.

암호 함수는 민감한 데이터를 해시하고 이러한 해시로 작업하는 편리한 방법을 제공합니다.

password_hash()는 현재 사용 가능한 가장 강력한 알고리즘을 사용하여 주어진 문자열을 해시하는 데 사용되며 password_verify()는 주어진 암호가 데이터베이스에 저장된 해시와 일치하는지 확인합니다.

예제 #1 해싱 암호 필드

                  
<?php

// storing password hash
$query  = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
            pg_escape_string($username),
            password_hash($password, PASSWORD_DEFAULT));
$result = pg_query($connection, $query);

// querying if user submitted the right password
$query = sprintf("SELECT pwd FROM users WHERE name='%s';",
            pg_escape_string($username));
$row = pg_fetch_assoc(pg_query($connection, $query));

if ($row && password_verify($password, $row['pwd'])) {
    echo 'Welcome, ' . htmlspecialchars($username) . '!';
} else {
    echo 'Authentication failed for ' . htmlspecialchars($username) . '.';
}

?>