Programming/PHP

[PHP] #21 PHP 문자열 함수, 문자열 암호화 및 해싱 password_hash부터 md5까지

TOASTDEV 2025. 8. 10. 16:00
반응형

 

 

안녕하세요, 토스트데브입니다.
웹 개발에서 회원가입, 로그인, 민감한 데이터 저장 등을 구현할 때 꼭 알아야 할 것이 바로 문자열 암호화 및 해싱 처리입니다.
이번 글에서는 PHP에서 자주 쓰이는 암호화와 해시 관련 함수들을 정리해보겠습니다.

 

 

✅ 해싱 vs 암호화의 차이 간단 정리

구분 해싱 (Hashing) 암호화 (Encryption)
목적 데이터 무결성 확인, 비밀번호 저장 데이터 보안, 복호화 가능
특징 일방향 (복호화 불가능) 양방향 (복호화 가능)
대표 함수 password_hash(), md5(), sha1() openssl_encrypt(), mcrypt_*() 등

 

 

✅ 1. password_hash() – 안전한 비밀번호 해싱

$password = "mySecret123";
$hashed = password_hash($password, PASSWORD_DEFAULT);

echo $hashed;
// 출력: $2y$10$N9qo8uLOickgx2ZMRZoMye...

 

  • PHP에서 비밀번호 저장 시 권장되는 방법
  • 내부적으로 bcrypt 알고리즘 사용
  • salt 자동 생성 + 반복 횟수 설정 가능

 

🔒 비밀번호 확인: password_verify()

if (password_verify("mySecret123", $hashed)) {
  echo "비밀번호 일치!";
}

 

 

⚠️ md5()와 sha1()은 이제 사용 자제!

echo md5("mypassword");  // d3486ae9136e7856bc42212385ea797094475802
echo sha1("mypassword");

 

  • 빠르지만 보안에 취약
  • 충돌(collision) 발생 위험
  • 오래된 시스템에서만 호환용으로 사용

 

 

✅ 2. hash() – 다양한 해시 알고리즘 지원

echo hash("sha256", "secureData");

 

 

  • sha256, sha512, ripemd160 등 다양한 알고리즘 제공
  • md5나 sha1보다 강력한 보안을 위해 사용 가능
  • 단, 여전히 비밀번호 저장엔 password_hash()가 더 안전

 

 

✅ 3. openssl_encrypt() – 양방향 대칭키 암호화

$data = "secret";
$key = "myKey1234567890";
$method = "AES-128-ECB";

$encrypted = openssl_encrypt($data, $method, $key);
echo $encrypted;

 

 

  • 복호화 가능한 암호화 방식
  • 민감한 정보를 저장할 때 사용
  • 복호화: openssl_decrypt()

 

 

✅ 4. 실전 예: 로그인 구현 시 해싱 처리

// 회원가입 시
$password = $_POST['password'];
$hash = password_hash($password, PASSWORD_DEFAULT);
save_to_db($hash);  // 저장

// 로그인 시
$input = $_POST['password'];
$stored = get_from_db();

if (password_verify($input, $stored)) {
  echo "로그인 성공";
} else {
  echo "비밀번호 불일치";
}

 

 

 

📌 정리 요약표

함수 설명 추천용도
password_hash() 안전한 비밀번호 해시 생성 로그인 시스템
password_verify() 해시된 비밀번호 검증 로그인 시 검증
md5(), sha1() 빠른 해시 (보안 약함) 호환용 또는 체크섬
hash() 다양한 해시 알고리즘 지원 무결성 확인
openssl_encrypt() 대칭키 암호화 복호화 가능한 민감정보 저장

 

 

🛡 보안 팁

  • 비밀번호 저장은 반드시 password_hash() 사용
  • md5()/sha1()은 가능하면 피할 것
  • API 키, 민감 데이터는 openssl_encrypt()로 암호화 후 저장
  • HTTPS 통신을 통해 네트워크 보안도 함께 고려해야 안전합니다

 

 

#PHP문자열 #문자열암호화 #해시함수 #password_hash #md5 #sha1 #hash #openssl_encrypt #PHP보안 #코딩입문 #웹보안 #toastdev

반응형