programing

사용자의 비밀번호를 안전하게 저장하려면 어떻게 해야 합니까?

firstcheck 2022. 10. 2. 22:57
반응형

사용자의 비밀번호를 안전하게 저장하려면 어떻게 해야 합니까?

일반 MD5보다 얼마나 안전합니까? 비밀번호 보안에 대해 알아보려고 합니다.저는 PHP를 처음 접합니다.

$salt = 'csdnfgksdgojnmfnb';

$password = md5($salt.$_POST['password']);
$result = mysql_query("SELECT id FROM users
                       WHERE username = '".mysql_real_escape_string($_POST['username'])."'
                       AND password = '$password'");

if (mysql_num_rows($result) < 1) {
    /* Access denied */
    echo "The username or password you entered is incorrect.";
} 
else {
    $_SESSION['id'] = mysql_result($result, 0, 'id');
    #header("Location: ./");
    echo "Hello $_SESSION[id]!";
}

암호 저장 방식을 안전하게 보호하는 가장 쉬운 방법은 표준 라이브러리를 사용하는 것입니다.

보안은 대부분의 프로그래머가 단독으로 처리할 수 있는 것보다 훨씬 복잡하고 눈에 보이지 않는 문제가 발생할 가능성이 높기 때문에 표준 라이브러리를 사용하는 것이 거의 항상 가장 쉽고 안전한 옵션입니다(유일한 옵션은 아니더라도).


새로운 PHP 비밀번호 API(5.5.0+)

PHP 버전 5.5.0 이후를 사용하는 경우 새로운 간이 비밀번호 해시 API를 사용할 수 있습니다.

PHP 비밀번호 API를 사용한 코드 예시:

<?php
// $hash is what you would store in your database
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT, ['cost' => 12]);

// $hash would be the $hash (above) stored in your database for this user
$checked = password_verify($_POST['password'], $hash);
if ($checked) {
    echo 'password correct';
} else {
    echo 'wrong credentials';
}

(레거시 5.3.7 이후를 사용하고 있는 경우는, ircmaxell/password_compat 를 인스톨 하고, 빌트인 기능에 액세스 할 수 있습니다).


소금에 절인 해시 개선: 후추 추가

보안을 강화하려면 현재(2017년) 보안 담당자는 자동으로 소금에 절인 암호 해시에 '페퍼'를 추가할 것을 권장합니다.

이 패턴을 안전하게 구현하는 간단한 드롭 인 클래스가 있습니다.권장하는 것은 다음과 같습니다.Netsilik/Peppered Passwords(github).
이것은 MIT 라이선스와 함께 제공되기 때문에 독점 프로젝트에서도 원하는 대로 사용할 수 있습니다.

「」를 사용한 의 예Netsilik/PepperedPasswords:

<?php
use Netsilik/Lib/PepperedPasswords;

// Some long, random, binary string, encoded as hexadecimal; stored in your configuration (NOT in your Database, as that would defeat the entire purpose of the pepper).
$config['pepper'] = hex2bin('012345679ABCDEF012345679ABCDEF012345679ABCDEF012345679ABCDEF');

$hasher = new PepperedPasswords($config['pepper']);

// $hash is what you would store in your database
$hash = $hasher->hash($_POST['password']);

// $hash would be the $hash (above) stored in your database for this user
$checked = $hasher->verify($_POST['password'], $hash);
if ($checked) {
    echo 'password correct';
} else {
    echo 'wrong credentials';
}


구 표준 라이브러리

주의: 더 이상 필요 없습니다!이것은 단지 역사적 목적을 위한 것이다.

PHP 패스워드 해싱Portable Framework: phpass 를 참조해 주세요.CRYPT_BLOWFISH가능한 경우 알고리즘을 사용합니다.

phpass(v0.2)를 사용한 코드 예시:

<?php
require('PasswordHash.php');

$pwdHasher = new PasswordHash(8, FALSE);

// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );

// $hash would be the $hash (above) stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
    echo 'password correct';
} else {
    echo 'wrong credentials';
}

PHPass는 잘 알려진 프로젝트에 구현되어 있습니다.

  • phpBB3
  • WordPress 2.5+ 및 bbPress
  • Drupal 7 릴리즈 (Drupal 5 & 6에서 사용 가능한 모듈)
  • 다른이들

좋은 점은 당신이 세부사항에 대해 걱정할 필요가 없다는 것이다. 그 세부사항들은 경험이 있는 사람들에 의해 프로그램되고 많은 사람들이 인터넷에서 리뷰를 하고 있다.

패스워드 스토리지 스킴의 상세한 것에 대하여는, Jeff의 블로그 투고를 참조해 주세요.패스워드를 잘못 저장했을 가능성이 있다

'제가 직접 하겠습니다, 감사합니다'라는 접근 방식을 택하면 무엇을 하든, 사용하지 않거나 더 이상 사용하지 마십시오.이 알고리즘은 양호한 해시 알고리즘이지만 보안상의 이유로 파손된 것으로 간주됩니다.

현재는 crypt_BLOWFISH와 함께 crypt를 사용하는 것이 베스트 프랙티스입니다.
PHP CRYPT_BLOWFISH Bcrypt입니다.Bcrypt는 Blowfish 블록 암호에 기반하여 알고리즘 속도를 늦추기 위해 비싼 키 설정을 사용합니다.

SQL 문을 연결하는 대신 매개 변수화된 쿼리를 사용하면 사용자가 훨씬 안전합니다.또한 소트는 사용자별로 고유해야 하며 비밀번호 해시와 함께 저장해야 합니다.

더 좋은 방법은 각각의 사용자가 고유한 소금을 먹는 것이다.

Salt의 장점은 공격자가 모든 사전 단어의 MD5 시그니처를 미리 생성하기가 더 어려워진다는 것입니다.그러나 공격자가 사용자가 고정 솔트를 가지고 있다는 것을 알게 되면 사용자가 고정 솔트로 접두하는 모든 사전 단어의 MD5 시그니처를 미리 생성할 수 있습니다.

더 좋은 방법은 사용자가 비밀번호를 변경할 때마다 시스템에서 임의의 솔트를 생성하여 사용자 레코드와 함께 저장하는 것입니다.MD5 시그니처를 생성하기 전에 솔트를 검색해야 하기 때문에 패스워드를 체크하는 것은 다소 비용이 들지만 공격자가 MD5를 사전에 생성하는 것은 훨씬 어렵습니다.

PHP 5.5에서는 (내가 설명하는 것은 이전 버전에서도 사용 가능), 새로운 내장 솔루션인: 및 를 사용하는 것을 제안합니다.필요한 비밀번호 보안 수준을 실현하기 위해 몇 가지 옵션을 제공합니다(예를 들어 를 통해 "비용" 파라미터를 지정함).$optionsarray(어레이를 참조해 주세요.

<?php
var_dump(password_hash("my-secret-password", PASSWORD_DEFAULT));

$options = array(
    'cost' => 7, // this is the number of rounds for bcrypt
    // 'salt' => 'TphfsM82o1uEKlfP9vf1f', // you could specify a salt but it is not recommended
);
var_dump(password_hash("my-secret-password", PASSWORD_BCRYPT, $options));
?>

돌아온다

string(60) "$2y$10$w2LxXdIcqJpD6idFTNn.eeZbKesdu5y41ksL22iI8C4/6EweI7OK."
string(60) "$2y$07$TphfsM82o1uEKlfP9vf1fOKohBqGVXOJEmnUtQu7Y1UMft1R4D3d."

보시는 바와 같이 문자열에는 소금과 옵션에 지정된 비용이 포함됩니다.사용되는 알고리즘도 포함되어 있습니다.

할 때(를 들어 했을 때)에는, 무료의 「」(「」)를 할 때, 「」가 됩니다.password_verify()이 함수는 패스워드 해시 자체에서 필요한 암호 파라미터를 추출합니다.

하지 않을 salt .password_hash()이치노따라서 이전 해시와 새로 생성된 해시를 비교하는 것은 올바른 패스워드를 사용하더라도 실패합니다.

검증은 다음과 같이 동작합니다.

var_dump(password_verify("my-secret-password", '$2y$10$BjHJbMCNWIJq7xiAeyFaHOGaO0jjNoE11e0YAer6Zu01OZHN/gk6K'));
var_dump(password_verify("wrong-password", '$2y$10$BjHJbMCNWIJq7xiAeyFaHOGaO0jjNoE11e0YAer6Zu01OZHN/gk6K'));

var_dump(password_verify("my-secret-password", '$2y$07$TphfsM82o1uEKlfP9vf1fOKohBqGVXOJEmnUtQu7Y1UMft1R4D3d.'));
var_dump(password_verify("wrong-password", '$2y$07$TphfsM82o1uEKlfP9vf1fOKohBqGVXOJEmnUtQu7Y1UMft1R4D3d.'));

이러한 빌트인 기능을 제공함으로써 프로그래머가 적절한 구현에 투입해야 하는 생각을 줄일 수 있기 때문에 데이터 도난 시 패스워드 보안을 강화할 수 있기를 바랍니다.

PHP 5.5를 제공하는 작은 라이브러리(PHP 파일 1개)가 있습니다.password_hashPHP 5.3.7+의 경우:https://github.com/ircmaxell/password_compat

저는 괜찮습니다.Atwood씨는 무지개 테이블에 대한 MD5의 강도에 대해 기술했습니다.기본적으로 예쁜 자리에 앉아 있는 것처럼 긴 소금으로 (임의의 구두점/숫자라면 개선할 수 있습니다).

요즘 인기를 끌고 있는 SHA-1도 볼 수 있습니다.

추가할 내용:

  • 사용자 비밀번호를 길이로 제한하지 않음

오래된 시스템과의 호환성을 위해 비밀번호의 최대 길이 제한을 설정하는 경우가 많습니다.이는 잘못된 보안 정책입니다. 제한을 설정할 경우 최소 암호 길이에 대해서만 설정하십시오.

  • 사용자 비밀번호를 이메일로 보내지 않음

잊어버린 비밀번호를 회복하려면 사용자가 비밀번호를 변경할 수 있는 주소를 전송해야 합니다.

  • 사용자 비밀번호 해시 업데이트

패스워드 해시가 최신이 아닐 수 있습니다(알고리즘의 파라미터가 갱신될 수 있습니다).기능을 사용하면 확인할 수 있습니다.

여기 일반 텍스트 비밀번호를 저장하지 않는 PHP + CouchDB.apache.org 로그인 시스템이 있습니다.

내가 읽은 조언에 따르면, 그것은 완전히 안전해야 한다.

CMS 로그인 코드: https://github.com/nicerapp/nicerapp/blob/24ff0ca317b28c1d91aee66041320976a6d76da7/nicerapp/boot.php#L56에서 https://github.com/nicerapp/nicerapp/blob/24ff0ca317b28c1d91aee66041320976a6d76da7/nicerapp/functions.php#L171으로 전화합니다.

app(s) 고유의 비즈니스 코드: https://github.com/nicerapp/nicerapp/blob/24ff0ca317b28c1d91aee66041320976a6d76da7/nicerapp/ajax_login.php#L87는 https://github.com/nicerapp/nicerapp/blob/24ff0ca317b28c1d91aee66041320976a6d76da7/nicerapp/functions.php#L230을 호출하고, https://github.com/nicerapp/nicerapp/blob/24ff0ca317b28c1d91aee66041320976a6d76da7/nicerapp/functions.php#L230는 다음 명령을 호출합니다.https://github.com/nicerapp/nicerapp/blob/2d479b3e22dce9e7073525481b775f1bf7389634/nicerapp/apps/nicer.app/webmail/recrypt.php#L2

및 웹 메일 앱 구성 데이터를 데이터베이스로 편집하려면 https://github.com/nicerapp/nicerapp/blob/main/nicerapp/apps/nicer.app/webmail/ajax_editConfig.php를 방문하십시오.

언급URL : https://stackoverflow.com/questions/1581610/how-can-i-store-my-users-passwords-safely

반응형