현재 위치: > 최신 기사 목록> Crypt () 기존 시스템에 사용되는 암호 데이터를 최신 시스템으로 가져오고 호환성을 보장하는 방법은 무엇입니까?

Crypt () 기존 시스템에 사용되는 암호 데이터를 최신 시스템으로 가져오고 호환성을 보장하는 방법은 무엇입니까?

M66 2025-06-23

수년 또는 10 년 이상 동안 사용 된 많은 PHP 프로젝트에서 사용자 암호는 종종 crypt () 함수를 사용하여 암호화됩니다. 이 접근법은 과거에는 매우 일반적 이었지만 오늘날의 보안 표준에 따라 Password_hash ()Password_verify () 와 같은 더 강력한 알고리즘으로 대체되었습니다. 그러나 시스템 마이그레이션 또는 업그레이드시기에도 여전히 모든 사용자가 암호를 재설정하도록 강요 할 수없는 경우 기존 데이터와 호환되어야합니다.

이 기사는 Crypt () 로 암호화 된 이전 비밀번호 데이터를 새 시스템으로 원활하게 마이그레이션하는 방법을 소개하고 새 시스템이 이전 비밀번호 확인과 호환되며 사용자 로그인 한 후에보다 안전한 암호화 방법으로 점차 전환 할 수 있는지 확인합니다.

1. crypt () 의 암호화 논리 이해

PHP의 Crypt () 함수는 기존 DES, MD5, SHA-256, SHA-512 등과 같은 다른 암호화 알고리즘을 사용할 수 있습니다. 암호화 방법은 제공된 "소금"에 따라 다릅니다.

  • DES 암호화 (2 차 소금)

  • MD5 암호화 ( $ 1 $ 로 시작하는 소금)

  • SHA-256 암호화 ( $ 5 $ 로 시작하는 소금)

  • SHA-512 암호화 ( $ 6 $ 로 시작하는 소금)

예를 들어:

 $hashed = crypt('mypassword', '$1$somesalt$'); // 사용 MD5 암호화

확인할 때는 일반 텍스트 비밀번호와 전체 해시를 crypt () 로 전달하면됩니다.

 if (crypt($inputPassword, $storedHash) === $storedHash) {
    // 비밀번호 일치
}

2. 디자인 호환성 솔루션

목표는 새 시스템이 Old Crypt () 암호화 암호와 최신 암호 _hash () 암호화 암호를 모두 지원하고 사용자가 로그인 할 때 원활한 업그레이드를 완료 할 수 있도록하는 것입니다.

1. 데이터베이스 구조와 호환됩니다

이전 시스템의 비밀번호 필드는 암호 로 명명 될 수 있으며 Crypt () 의 결과를 저장합니다. 새 시스템은이 필드를 계속 사용할 수 있거나 암호가 이전 암호화 방법인지 여부를 표시하기 위해 IS_LEGACY 필드를 소개 할 수 있습니다.

2. 로그인 검증 로직

사용자가 로그인하면 시스템은 저장된 비밀번호 형식을 결정하고 해당 확인 방법을 사용해야합니다.

 function verifyPassword($inputPassword, $storedHash) {
    if (password_get_info($storedHash)['algo'] !== 0) {
        // 예 password_hash() 체재
        return password_verify($inputPassword, $storedHash);
    } else {
        // 예 crypt() 체재
        return crypt($inputPassword, $storedHash) === $storedHash;
    }
}

3. 로그인 후 암호 암호화 방법을 업그레이드하십시오

이전 비밀번호로 성공적으로 로그인 한 후에는 Password_Hash () 로 암호를 즉시 다시 연결하고 데이터베이스를 업데이트해야합니다.

 function upgradePassword($userId, $inputPassword) {
    $newHash = password_hash($inputPassword, PASSWORD_DEFAULT);
    // 假设사용 PDO 데이터베이스에 연결하십시오
    $stmt = $pdo->prepare("UPDATE users SET password = :password WHERE id = :id");
    $stmt->execute(['password' => $newHash, 'id' => $userId]);
}

성공적인 확인 후이 기능을 호출하여 원활한 업그레이드를 달성하십시오.

4. 중간 중간 공격을 피하십시오

Crypt () 자체는 안전하지 않지만 HTTPS 및 기타 방법을 통해 여전히 위험을 줄일 수 있습니다. 시스템에서 로그인 인터페이스가 TLS/SSL을 사용하여 암호화되어 있는지 확인하십시오.

예를 들어 다음 로그인 인터페이스 (pseudocode)를 사용하십시오.

 $url = 'https://m66.net/api/login';

이 인터페이스는 데이터 전송 중 기밀성과 무결성을 보장하기 위해 안전한 서버 환경에 배포해야합니다.

3. 최종 코드 예제

다음은 전체 로그인 처리 로직입니다.

 function handleLogin($username, $inputPassword) {
    global $pdo;

    $stmt = $pdo->prepare("SELECT id, password FROM users WHERE username = :username");
    $stmt->execute(['username' => $username]);
    $user = $stmt->fetch();

    if (!$user) {
        return false;
    }

    $storedHash = $user['password'];
    if (verifyPassword($inputPassword, $storedHash)) {
        // 如果예旧체재密码,업그레이드를 진행하십시오
        if (password_get_info($storedHash)['algo'] === 0) {
            upgradePassword($user['id'], $inputPassword);
        }
        return true;
    }

    return false;
}

결론

시스템 마이그레이션 중에 이전 비밀번호 검증 로직을 유지하는 것은 실용적인 접근 방식으로, 사용자 경험을 보장 할뿐만 아니라 보안을 희생하지 않습니다. 위의 방법을 통해 Old Crypt () 암호화 방법에 대한 호환 가능한 지원을 달성하고 향후 전체 시스템의 보안을 향상시키기 위해 미래의보다 현대적인 암호화 메커니즘으로 점차 전환 할 수 있습니다. 보안은 암호화 알고리즘의 옵션 일뿐 만 아니라 데이터 전송, 스토리지 및 시스템 아키텍처에 대한 포괄적 인 고려 사항이라는 점을 항상 기억하십시오.