>백엔드 개발 >PHP 튜토리얼 >PHP 개발자는 비밀번호 보호와 Laravel의 기본 비밀번호 저장 및 확인 구현을 어떻게 수행합니까?

PHP 개발자는 비밀번호 보호와 Laravel의 기본 비밀번호 저장 및 확인 구현을 어떻게 수행합니까?

藏色散人
藏色散人앞으로
2020-04-26 11:59:302846검색

온라인 공격이 증가함에 따라 비밀번호 보안이 점점 더 중요해지고 있습니다. 개발자로서 우리는 애플리케이션이 단순한 게임이든 일급 비밀 비즈니스 문서 저장소이든 보안 관리, 해시 계산, 사용자 비밀번호 저장을 담당합니다. PHP에는 비밀번호를 보다 쉽게 ​​보호할 수 있는 몇 가지 도구가 내장되어 있습니다. 이 섹션에서는 최신 보안 조치에 따라 이러한 도구를 사용하는 방법에 대해 설명합니다.

1. 비밀번호 보호의 세 가지 원칙

사용자의 비밀번호를 절대 알면 안 됩니다

사용자의 비밀번호를 알 수 없어야 하며, 애플리케이션의 데이터베이스가 해킹된 경우 사용자의 비밀번호를 알아낼 수 없습니다. , 당신은 확실히 원하지 않습니다. 데이터베이스에 일반 텍스트 또는 해독 가능한 비밀번호가 있습니다. 언제든지 아는 것이 적을수록 더 안전합니다.

사용자 비밀번호를 제한하지 마세요

특정 패턴을 따르도록 비밀번호를 요구하는 경우 실제로는 나쁜 의도를 가진 사람들이 애플리케이션을 공격할 수 있는 수단을 제공합니다. 비밀번호를 제한해야 한다면 비밀번호만 제한하는 것이 좋습니다. 최소 길이를 유지하고 일반적으로 사용되는 비밀번호를 교체하는 것도 좋습니다. 비밀번호나 사전을 기반으로 생성된 비밀번호를 블랙리스트에 추가하는 것도 좋습니다.

이메일을 통해 사용자 비밀번호를 보내지 마세요

사용자에게 비밀번호를 이메일로 보내면 사용자는 세 가지 사실을 알게 됩니다. 귀하는 자신의 비밀번호를 알고 있으며 비밀번호를 일반 텍스트 또는 해독할 수 있는 방식으로 저장했습니다. 인터넷을 통해 일반 텍스트 비밀번호를 보내는 것에 대해 걱정할 필요가 없습니다.

비밀번호를 설정하거나 변경하기 위한 URL을 이메일로 보내야 합니다. 웹 애플리케이션은 일반적으로 고유한 토큰을 생성합니다. 이 토큰은 비밀번호를 설정하거나 변경할 때 일반적으로 이 토큰을 사용합니다. 사용자가 이 URL에 액세스하면 애플리케이션은 토큰이 유효한지 확인하고 작업이 완료된 후 작업을 계속합니다. 재사용할 수 없습니다.

2. 비밀번호 저장 알고리즘

비밀번호 저장에 관한 가장 좋은 방법은 사용자의 비밀번호를 암호화하는 것보다 비밀번호의 해시 값을 계산하는 것입니다. 암호화와 해싱은 동일한 것이 아닙니다. 암호화된 데이터는 해독될 수 있지만 해싱은 단방향 알고리즘입니다. 동일한 데이터는 항상 동일합니다.

사용자의 비밀번호를 데이터베이스에 저장하려면 먼저 비밀번호의 해시 값을 계산한 다음 해당 비밀번호의 해시 값을 데이터베이스에 저장해야 합니다. 해커가 데이터베이스에 침입하면 의미 없는 비밀번호만 보게 됩니다. 비용이 많이 드는 해시 값을 해독하려면 많은 시간과 NSA 리소스가 필요합니다.

많은 해시 알고리즘(예: md5, SHA1, bcrypt 및 scrypt)이 있습니다. 일부 알고리즘은 매우 빠르며 데이터 무결성을 확인하는 데 사용되며 일부 알고리즘은 매우 느리고 보안을 향상하도록 설계되었습니다. 비밀번호를 생성하고 저장할 때 느리고 매우 안전한 알고리즘을 사용하십시오.

현재 가장 안전한 알고리즘은 bcrypt입니다. md5 및 SHA1과 달리 bcrypt는 잠재적인 레인보우 테이블 공격을 방지하기 위해 자동으로 솔트를 추가합니다. 특히 안전한 해시를 생성합니다. 이 과정에서 데이터가 처리되는 횟수를 작업 요소라고 합니다. 작업 요소의 값이 높을수록 비밀번호를 해독하는 데 시간이 오래 걸리고 보안이 향상됩니다. bcrypt 알고리즘은 결코 시대에 뒤떨어지지 않습니다. 컴퓨터 작동 속도가 빨라지면 작업 요소의 값만 높이면 됩니다.

3. 비밀번호 해시 API

앞서 소개를 통해 사용자 비밀번호를 처리할 때 고려해야 할 사항이 많다는 것을 알았습니다. 다행히 PHP 5.5.0의 기본 해시 API(http://php.net/manual/ zh/book.password.php)은 사용하기 쉬운 다양한 기능을 제공하여 비밀번호 해시 계산 및 비밀번호 확인 작업을 크게 단순화합니다. 또한 이 비밀번호 해싱 API는 기본적으로 bcrpt 알고리즘을 사용합니다.

웹 애플리케이션을 개발할 때 비밀번호 해시 API가 사용되는 곳은 등록된 사용자와 사용자 로그인 두 곳이 있습니다. Laravel에서 제공하는 사용자 등록과 로그인을 예로 들어 이 두 가지 측면을 사용 시 어떻게 단순화하는지 살펴보겠습니다. PHP 비밀번호 해시 API.

참고: Laraval 프레임워크에 내장된 사용자 등록 및 로그인 기능은 PHP 해시 API를 사용하여 비밀번호를 저장하고 확인합니다.

Registered users

AuthController에서 사용자 등록이 완료되고, 신규 사용자 생성은 컨트롤러의 create 메소드에서 구현됩니다.

PHP 개발자는 비밀번호 보호와 Laravel의 기본 비밀번호 저장 및 확인 구현을 어떻게 수행합니까?

라라벨에서 제공하는 보조 함수인 bcrypt를 사용하는 것을 볼 수 있습니다. 여기에 사용자를 제출하려면 비밀번호가 해시되어 데이터베이스에 저장됩니다. bcrypt 함수는 다음과 같이 정의됩니다.

PHP 개발자는 비밀번호 보호와 Laravel의 기본 비밀번호 저장 및 확인 구현을 어떻게 수행합니까?

여기서 해시로 별칭이 지정된 서비스 제공자 인스턴스의 make 메소드가 실제로 해시 비밀번호를 구현하기 위해 호출되는 것을 볼 수 있으며, HashServiceProvider를 입력하고, 등록 메소드에서 우리는 볼 수 있습니다 해시 대응 클래스는 BcryptHasher이며, 이 클래스에서 make 메소드를 찾습니다:

PHP 개발자는 비밀번호 보호와 Laravel의 기본 비밀번호 저장 및 확인 구현을 어떻게 수행합니까?

여기서 핵심은 PHP에서 제공하는 Password_hash 함수를 호출하는 것입니다. 이 함수는 세 개의 매개변수를 받습니다. 첫 번째 매개변수는 사용자가 입력한 비밀번호 값이고, 두 번째 매개변수는 사용된 해시 알고리즘입니다(더 많은 알고리즘 보기: http://php) .net/manual/zh/password.constants.php), 세 번째 매개변수는 선택사항이며, 각각 간섭 문자열(소금)과 앞서 언급한 작업 요소를 나타내는 솔트 및 비용 옵션을 포함하여 작업 계수가 향상됩니다. 하드웨어 성능 향상 전송되지 않는 경우 무작위 솔팅 및 기본 작업 계수가 사용됩니다(해시 값을 계산하는 데 일반적으로 0.1~0.5초 소요). 계산이 실패하면 예외가 발생합니다.

사용자 로그인

Larval에서 사용자 로그인 인증을 구현하기 위해 auth.php에서 세션을 경비원으로 사용하고 공급자로 웅변적인 예를 들어보세요(실제로 기본 설정은 이렇습니다). 로그인 인증은 결국 verifyCredentials로 이동합니다. EloquentUserProvider의 메소드:

PHP 개발자는 비밀번호 보호와 Laravel의 기본 비밀번호 저장 및 확인 구현을 어떻게 수행합니까?

$this->해셔의 해당 구현도 BcryptHasher 클래스입니다. 확인 메소드를 확인해 보겠습니다.

PHP 개발자는 비밀번호 보호와 Laravel의 기본 비밀번호 저장 및 확인 구현을 어떻게 수행합니까?

전달된 첫 번째 매개변수는 사용자가 입력한 비밀번호입니다. 두 번째 매개변수는 사용자 등록 시 저장된 비밀번호 해시 값입니다. 해시 값이 비어 있으면 false를 직접 반환합니다. 그렇지 않으면 PHP에서 제공하는 비밀번호 확인 함수를 호출하여 비밀번호(일반 텍스트)를 확인합니다. )과 해시 값이 일치합니다. 해시 값이 일치하면 true를 반환합니다.

해시 값 다시 계산

위 단계를 통해 사용자는 이미 로그인 인증을 얻을 수 있지만, 로그인하기 전에 기존 비밀번호 해시 값이 만료되었는지도 확인해야 합니다. 값을 다시 계산해야 합니다.

왜 다시 계산해야 하나요? 우리와 합류한 애플리케이션은 2년 전에 만들어졌으며 작업 요소 10을 사용했습니다. 이제는 컴퓨터가 더 빠르고 해커가 더 똑똑하기 때문에 20을 사용합니다. 작업 팩터가 10인 경우에도 일부 사용자의 비밀번호 해시 값이 계속 생성될 수 있습니다. 이때, 로그인 인증을 통과한 후 사용자 레코드의 기존 해시 값을 업데이트해야 하는지 여부를 확인하기 위해 비밀번호_needs_refresh 함수를 사용해야 합니다. 이 기능은 최신 해싱 알고리즘을 사용하여 지정된 비밀번호 해시가 생성되도록 할 수 있습니다. 생성된 비밀번호의 해시 값을 다시 계산해야 하는 경우 make 메소드를 사용하여 새 해시 값을 생성하고 데이터베이스의 원래 비밀번호를 업데이트하세요.

이 기능은 현재 라라발에서는 사용되지 않으나 BcryptHasher 클래스에서 해당 기능을 제공하고 있습니다:

PHP 개발자는 비밀번호 보호와 Laravel의 기본 비밀번호 저장 및 확인 구현을 어떻게 수행합니까?

원본 주소: https://xueyuanjun.com/post/4764

위 내용은 PHP 개발자는 비밀번호 보호와 Laravel의 기본 비밀번호 저장 및 확인 구현을 어떻게 수행합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 xueyuanjun.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제