PHP 로그인을 만들고 있는데 다른 stackoverflow 기사에서 읽은 SHA1 또는 Md5 또는 SHA256을 사용할지 결정하려고합니다. 다른 것보다 더 안전한 것이 있습니까? SHA1 / 256의 경우 여전히 소금을 사용합니까?
또한 이것은 암호를 mysql에서 해시로 저장하는 안전한 방법입니까?
function createSalt()
{
$string = md5(uniqid(rand(), true));
return substr($string, 0, 3);
}
$salt = createSalt();
$hash = sha1($salt . $hash);
답변
둘 다. 을 사용해야합니다 bcrypt
. 언급 한 해시는 하드웨어에서 빠르고 쉽게 최적화되어 있으므로 크래킹시 동일한 품질을 공유합니다. 다른 선택이 없다면 적어도 긴 소금을 사용하고 여러 번 다시 해시하십시오.
PHP 5.5 이상에서 bcrypt 사용
PHP 5.5는 패스워드 해싱을위한 새로운 기능을 제공합니다 . 이것은 최신 웹 응용 프로그램의 암호 저장소에 권장되는 방법입니다.
// Creating a hash
$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]);
// If you omit the ['cost' => 12] part, it will default to 10
// Verifying the password against the stored hash
if (password_verify($password, $hash)) {
// Success! Log the user in here.
}
이전 버전의 PHP 를 사용하는 경우 실제로 업그레이드해야 하지만 그렇게 할 때까지 password_compat 를 사용 하여이 API를 노출 할 수 있습니다 .
또한 password_hash()
소금을 만들어주세요. CSPRNG를 사용합니다 .
bcrypt의 두 가지 경고
- Bcrypt는 72 자보다 긴 암호를 자동으로 자릅니다.
- Bcrypt는
NUL
문자 다음에 잘립니다 .
( 여기에 두 가지 경고에 대한 개념 증명 )
bcrypt를 통해 비밀번호를 실행하기 전에 비밀번호 를 사전 해싱하여 첫 번째 경고를 해결하려는 유혹을받을 수 있지만, 그렇게하면 애플리케이션이 두 번째 비밀번호로 먼저 실행될 수 있습니다.
자체 스키마를 작성하는 대신 보안 전문가가 작성 및 / 또는 평가 한 기존 라이브러리를 사용하십시오.
Zend\Crypt
(젠드 프레임 워크의 일부) 제안BcryptSha
PasswordLock
비슷BcryptSha
하지만 인증 된 암호화 라이브러리를 사용하여 bcrypt 해시도 암호화합니다 .
TL; DR – bcrypt를 사용하십시오 .
답변
md5 또는 sha256 또는 속도에 최적화 된 해시를 사용하는 것은 완벽하게 훌륭하며 다른 사용자가 반박 할 수있는 소리가 매우 궁금합니다. 여기 내 이유가 있습니다
-
사용자가 신, 사랑, 전쟁, 평화와 같은 약한 암호를 사용하도록 허용하면 암호화에 관계없이 사용자가 여전히 해시가 아닌 암호를 입력 할 수있게 되며이 암호는 종종 먼저 사용되므로 계속 되지 않습니다 . 암호화와 관련이 있습니다.
-
SSL을 사용하지 않거나 인증서가없는 경우 트래픽을 수신하는 공격자는 비밀번호를 가져올 수 있으며, 자바 스크립트 등으로 암호화하려는 시도는 클라이언트 측이며 쉽게 해독하고 극복 할 수 있습니다. 다시 말하지만 이것은 서버 측의 데이터 암호화와 관련 이 없습니다 .
-
무차별 대입 공격은 취약한 암호를 사용하며, 로그인 제한이 3 이상 또는 조금 이상인 경우 사용자가 데이터를 입력 할 수 있도록 허용하므로 문제는 다시 데이터 암호화와 관련이 없습니다 .
-
데이터베이스가 손상되면 해킹 기술을 포함하여 아무리 비밀리에 상관없이 모든 것이 손상되었을 가능성이 큽니다. 다시 말하면 불만족스러운 직원 XSS 공격이나 SQL 삽입 또는 암호 암호화와 관련이없는 다른 공격 일 수 있습니다.
나는 당신이 여전히 암호화해야한다고 생각하지만 암호화가 볼 수있는 유일한 방법은 이미 데이터베이스에 액세스하거나 데이터베이스에 액세스 한 사람들이 비밀번호를 크게 읽지 못하게하는 것입니다. 데이터베이스에서 인증되지 않은 사람이라면 걱정할 큰 문제가 있습니다. 암호화 된 암호가 신용 카드 번호를 포함한 모든 것을 보호한다고 생각했기 때문에 Sony가 가져갔습니다.
데이터베이스에서 복잡한 암호 암호화를 볼 수있는 유일한 장점은 데이터베이스를 액세스하는 직원이나 다른 사람들이 암호를 읽지 못하도록 지연시키는 것입니다. 따라서 작은 프로젝트이거나 서버 측의 보안에 대해 크게 걱정할 필요가없는 경우 대신 클라이언트가 SQL 주입, XSS 공격 또는 기타 다양한 방법으로 서버에 보낼 수있는 것을 보호하는 것에 대해 더 걱정할 것입니다 손상 될 수 있습니다. 누군가 동의하지 않으면 슈퍼 암호화 된 암호가 클라이언트 측에서 반드시 필요한 방법을 읽기를 기대합니다.
사람들이 암호화 된 암호로 인해 암호가 손상 될 염려가없고 웹 사이트 보안에 대해 걱정하지 않아도된다는 사실을 너무 자주 생각하기 때문입니다.
답변
Johannes Gorset이 지적한 것처럼 Matasano Security의 Thomas Ptacek의 게시물은 왜 MD5, SHA1, SHA256 및 SHA512와 같은 단순한 범용 해싱 기능이 암호 해시 선택이 좋지 않은지 설명 합니다 .
왜? 너무 빠르므로 최신 컴퓨터에서 코어 당 초당 1,000,000 개의 MD5 해시를 계산할 수 있으므로 사람들이 사용하는 대부분의 암호에 대해 무차별 대입이 가능합니다. 그리고 그것은 GPU 기반 크래킹 서버 클러스터보다 훨씬 적습니다!
키 스트레칭없이 소금을 칠하는 것은 무지개 테이블을 미리 계산할 수 없다는 것을 의미하기 때문에 특정 소금에 맞게 임시 테이블을 만들어야합니다. 그러나 실제로 그렇게 어렵게 만들지는 않습니다.
사용자 @Will의 말 :
모두가 인터넷을 통해 해킹 당할 수있는 것처럼 이에 대해 이야기하고 있습니다. 이미 언급했듯이 시도를 제한하면 인터넷을 통해 암호를 해독 할 수 없으며 해시와 관련이 없습니다.
그들은 필요하지 않습니다. 분명히 LinkedIn의 경우 공통 SQL 주입 취약점 을 사용하여 로그인 DB 테이블을 가져와 오프라인에서 수백만 개의 암호를 해독했습니다.
그런 다음 그는 오프라인 공격 시나리오로 돌아갑니다.
전체 데이터베이스가 손상되면 해커가 md5 해시에 대해 초당 1 억 건의 비밀번호 시도를 수행 할 수 있습니다. SHA512는 약 10,000 배 느립니다.
아니요, SHA512 는 MD5보다 10000 배 느리지 않습니다. 약 두 배만 걸립니다. 반면에 Crypt / SHA512 는 BCrypt와 마찬가지로 키 스트레칭을 수행 하여 임의의 소금이 내장 된 매우 다른 해시를 생성하며 계산하는 데 500 ~ 999999 시간이 걸립니다. (신축 조정이 가능합니다).
SHA512 => aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
Crypt/SHA512 => $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21
따라서 PHP의 선택은 Crypt / Blowfish (BCrypt), Crypt / SHA256 또는 Crypt / SHA512입니다. 또는 적어도 Crypt / MD5 (PHK). www.php.net/manual/en/function.crypt.php 참조
답변
사용하십시오 SHA256
. SHA512
빠른 해시에 이상적 이므로 완벽 하지는 않지만 옵션 중에서 확실한 선택입니다. 해싱 기술에 따라 보안 강화를 위해 해시를 염두에 두어야합니다.
추가로 FRKT, 누군가가 소금에 절인 SHA256 해시를 쉽게 해독 할 수있는 곳을 보여 주시겠습니까? 나는 이것을 정말로보고 싶어한다.
중요 편집 :
앞으로는 bcrypt
강화 된 해시로 사용하십시오 . 자세한 내용은 여기를 참조하십시오 .
솔팅 편집 :
난수 또는 임의 바이트 스트림 등을 사용하십시오. 데이터베이스에서 레코드의 고유 필드를 소금으로 사용할 수도 있습니다. 이런 식으로 소금은 사용자마다 다릅니다.
답변
사람들이 누락 된 것처럼 보이는 것은 해커가 데이터베이스에 액세스 할 수 있다면 아마도 암호를 해시하는 PHP 파일에 액세스 할 수 있으며 모든 성공적인 사용자 이름 암호 콤보를 보내도록 수정할 수 있다는 것입니다. 웹 디렉토리에 액세스 할 수없는 경우 항상 비밀번호 해시를 선택하여 데이터베이스에 쓸 수 있습니다. 다시 말해 해시 알고리즘은 시스템 보안만큼 중요하지 않으며, SSL을 사용하지 않는 경우 로그인 시도를 제한하면 공격자가 정보를 얻기 위해 연결을 수신 할 수 있습니다. 계산에 오랜 시간이 걸리지 않는 한 (자신의 목적으로) 사용자 별 소금 이 포함 된 SHA-256 또는 SHA-512 이면 충분합니다.
추가 보안 조치로 스크립트 (bash, batch, python 등) 또는 프로그램을 설정하고 불명확 한 이름을 지정하고 login.php가 변경되었는지 (날짜 / 시간 스탬프 확인) 확인하고 이메일을 보내도록합니다 있다면. 또한 관리자 권한으로 로그인 할 때 모든 시도를 기록하고 데이터베이스에 로그인하여 로그를 이메일로 보내려는 모든 실패한 시도를 기록해야합니다.
답변
모두가 인터넷을 통해 해킹 당할 수있는 것처럼 이에 대해 이야기하고 있습니다. 이미 언급했듯이 시도를 제한하면 인터넷을 통해 암호를 해독 할 수 없으며 해시와 관련이 없습니다.
소금은 필수이지만 복잡성이나 여러 소금은 중요하지 않습니다. 소금 만 있으면 공격자가 미리 만든 레인보우 테이블을 사용하지 못하게됩니다. 사용자 당 고유 한 소금은 공격자가 전체 사용자 기반에 사용할 새 레인보우 테이블을 만들지 못하게합니다.
전체 데이터베이스가 손상되면 해커가 md5 해시에 대해 초당 1 억 건의 비밀번호 시도를 수행 할 수 있습니다. SHA512는 약 10,000 배 느립니다. 오늘날의 강력한 암호는 md5로 무차별 처리하는 데 100 년이 걸리고 SHA512에서는 10,000 배가 걸립니다. 솔트는 항상 알려 져야만하는 무차별 대입을 멈추지 않습니다. 공격자가 데이터베이스를 다운로드 한 경우 어쩌면 시스템에있을 수도 있습니다.
답변
충돌 문제로 인해 MD5가 잘못되었습니다. 두 개의 다른 암호로 동일한 md-5를 생성 할 수 있습니다.
Sha-1은 이것을 위해 충분히 안전 할 것입니다. 소금에 절인 sha-1 버전의 비밀번호를 저장하는 이유는 사용자가 다른 사람의 서버와 함께 사용할 수 있도록 사용자의 비밀번호를 파일에 보관하지 않기 때문입니다. 그렇지 않으면 어떤 차이가 있습니까?
해커가 암호화되지 않은 전체 데이터베이스를 어떤 방식으로 도용하는 경우 해시 된 소금에 절인 암호로 수행 할 수있는 유일한 방법은 향후 로그온을 위해 사용자를 가장하지 못하게하는 것입니다. 해커에는 이미 데이터가 있습니다.
사용자가 입력 한 것이 일반 암호 인 경우 침입자는 해시 값을 갖는 것이 무엇입니까?
그리고 미래 기술을 가진 해커가 무차별 대입 공격을 위해 초당 백만 개의 sha-1 키를 생성 할 수 있다고해도 해커가 키를 테스트하기 위해 서버에서 초당 백만 개의 로그온을 처리합니까? 해커가 일반 로그온과 같은 암호 대신 소금에 절인 sha-1로 로그온하도록 허용하는 경우입니다.
가장 좋은 방법은 잘못된 로그온 시도를 적당한 수 (예 : 25)로 제한 한 다음 사용자를 1 ~ 2 분 동안 시간 초과하는 것입니다. 그리고 24 시간 동안 누적 불량 로그온 시도가 250 회에 도달하면 계정 액세스를 종료하고 소유자에게 이메일을 보내십시오.
