Skip to content

해싱

소개

라라벨 Hash facade는 사용자 비밀번호를 저장하기 위한 안전한 Bcrypt 및 Argon2 해싱을 제공합니다. 라라벨 애플리케이션 스타터 키트 중 하나를 사용하는 경우, Bcrypt가 기본적으로 등록 및 인증에 사용됩니다.

Bcrypt는 "작업 요소"를 조정할 수 있기 때문에 비밀번호 해싱에 훌륭한 선택입니다. 즉, 하드웨어 성능이 향상됨에 따라 해시를 생성하는 데 걸리는 시간을 늘릴 수 있습니다. 비밀번호를 해시할 때는 느린 것이 좋습니다. 알고리즘이 비밀번호를 해시하는 데 시간이 오래 걸릴수록 악의적인 사용자가 애플리케이션에 대한 무차별 대입 공격에 사용될 수 있는 가능한 모든 문자열 해시 값의 "레인보우 테이블"을 생성하는 데 시간이 더 오래 걸립니다.

구성

기본적으로 라라벨은 데이터를 해시할 때 bcrypt 해싱 드라이버를 사용합니다. 그러나 argonargon2id를 포함한 여러 다른 해싱 드라이버가 지원됩니다.

HASH_DRIVER 환경 변수를 사용하여 애플리케이션의 해싱 드라이버를 지정할 수 있습니다. 그러나 라라벨의 모든 해싱 드라이버 옵션을 사용자 정의하려면 config:publish Artisan 명령을 사용하여 전체 hashing 구성 파일을 게시해야 합니다.

php artisan config:publish hashing

기본 사용법

비밀번호 해싱하기

Hash 파사드의 make 메소드를 호출하여 비밀번호를 해싱할 수 있습니다.

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
 
class PasswordController extends Controller
{
/**
* 사용자의 비밀번호를 업데이트합니다.
*/
public function update(Request $request): RedirectResponse
{
// 새 비밀번호 길이 유효성 검사...
 
$request->user()->fill([
'password' => Hash::make($request->newPassword)
])->save();
 
return redirect('/profile');
}
}

Bcrypt 작업 계수 조정하기

Bcrypt 알고리즘을 사용하는 경우, make 메소드를 사용하여 rounds 옵션을 통해 알고리즘의 작업 계수를 관리할 수 있습니다. 하지만 Laravel에서 관리하는 기본 작업 계수는 대부분의 애플리케이션에서 적합합니다.

$hashed = Hash::make('password', [
'rounds' => 12,
]);

Argon2 작업 계수 조정하기

Argon2 알고리즘을 사용하는 경우, make 메소드를 사용하여 memory, time, threads 옵션을 통해 알고리즘의 작업 계수를 관리할 수 있습니다. 하지만 Laravel에서 관리하는 기본 값은 대부분의 애플리케이션에서 적합합니다.

$hashed = Hash::make('password', [
'memory' => 1024,
'time' => 2,
'threads' => 2,
]);
lightbulb

이러한 옵션에 대한 자세한 내용은 Argon 해싱에 대한 공식 PHP 문서를 참조하십시오.

비밀번호가 해시와 일치하는지 확인하기

Hash 파사드에서 제공하는 check 메소드를 사용하면 주어진 일반 텍스트 문자열이 주어진 해시와 일치하는지 확인할 수 있습니다.

if (Hash::check('plain-text', $hashedPassword)) {
// 비밀번호가 일치합니다...
}

비밀번호를 재해싱해야 하는지 확인하기

Hash 파사드에서 제공하는 needsRehash 메소드를 사용하면 비밀번호가 해시된 이후 해시 알고리즘에서 사용한 작업 계수가 변경되었는지 여부를 확인할 수 있습니다. 일부 애플리케이션에서는 애플리케이션의 인증 프로세스 중에 이 검사를 수행하기로 선택합니다.

if (Hash::needsRehash($hashed)) {
$hashed = Hash::make('plain-text');
}

해시 알고리즘 검증

해시 알고리즘 조작을 방지하기 위해 Laravel의 Hash::check 메소드는 먼저 주어진 해시가 애플리케이션에서 선택한 해시 알고리즘을 사용하여 생성되었는지 확인합니다. 알고리즘이 다르면 RuntimeException 예외가 발생합니다.

이는 대부분의 애플리케이션에서 예상되는 동작이며, 해시 알고리즘이 변경될 것으로 예상되지 않고 다른 알고리즘이 악의적인 공격의 징후일 수 있습니다. 그러나 하나의 알고리즘에서 다른 알고리즘으로 마이그레이션하는 경우와 같이 애플리케이션 내에서 여러 해시 알고리즘을 지원해야 하는 경우, HASH_VERIFY 환경 변수를 false로 설정하여 해시 알고리즘 검증을 비활성화할 수 있습니다.

HASH_VERIFY=false