왜 보통 사용자 테이블을 구축할 때 솔트 필드를 추가하고, 비밀번호를 계산할 때 등록 페이지에 입력한 비밀번호와 무작위로 생성된 솔트 값을 기반으로 MD5 암호화를 수행하면 어떤 이점이 있나요? 마스터님, 자세히 설명해주세요.
왜 보통 사용자 테이블을 구축할 때 솔트 필드를 추가하고, 비밀번호를 계산할 때 등록 페이지에 입력한 비밀번호와 무작위로 생성된 솔트 값을 기반으로 MD5 암호화를 수행하면 어떤 이점이 있나요? 마스터님, 자세히 설명해주세요.
MD5로 암호화된 취약한 비밀번호는 여전히 무차별 대입이나 레인보우 테이블을 통해 크랙될 수 있습니다. 솔트를 추가하는 목적은 MD5 크래킹의 난이도를 높여 보안을 향상시키는 것입니다.
주로 데이터베이스를 도난당한 후 사용자의 비밀번호 일반 텍스트를 직접 얻는 것을 방지하기 위한 것입니다.
PHP 비밀번호 해시 보안
비밀번호 해시 관련 기능:
password_hash(권장) crypt(blowfish) hash sha1 md5
해시 함수는 sha512와 같은 여러 해싱 알고리즘 hash_algos를 지원합니다.
PHP 5.5는 기본 비밀번호 해싱 API(password_hash/password_verify)를 제공하며,
비밀번호 해싱 및 확인을 완료하는 안전한 방법을 제공합니다.
PHP 5.3.7 및 후속 버전에서 제공됩니다. PHP의 기본 비밀번호 해싱 API입니다.
PHP 버전이 Password_hash/password_verify를 지원하지 않는 경우 대신 crypt 구현을 사용하세요.
비밀번호 확인을 위해 crypt() 함수를 사용하는 경우 지속적인 시간 소모를 선택해야 합니다. 타이밍 공격을 피하기 위한 문자열 비교 알고리즘
일정한 시간이 소요된다는 것은 문자열 비교에 소요되는 시간이 일정하고 입력 데이터의 양에 따라 변하지 않는다는 것을 의미합니다.
함수는 상수 문자열 비교입니다. ==
하지만 ===
이 이 작업을 수행할 수 있습니다. strcmp()
따라서 API가 가능할 때마다 기본 비밀번호 해시를 사용하는 것이 좋습니다.
password_verify()
암호화 및 복호화 분야에서 "솔트"는 해싱 과정에서 추가된 일부 데이터를 의미합니다.
계산된 해시값 테이블("레인보우 테이블"이라고도 함)을 피하기 위해 사용됩니다.
계산된 A를 제공할 수 있는 온라인 서비스는 많습니다. 해시 값 목록과 해당 원본 입력이 포함되어 있으며 데이터 양이 매우 많습니다.
"소금"을 추가하면 목록에서 직접 해당 일반 텍스트를 찾는 위험을 피할 수 있습니다.
레인보우 테이블 암호화에 사용됩니다. 사전 계산된 역 해시 함수 테이블로, 암호화된 비밀번호 해시를 해독하는 데 자주 사용됩니다.
password_hash() 함수는 무작위로 "salt"를 생성합니다.
password_hash() 또는 crypt() 함수를 사용할 때 "salt"는 생성된 해시 값의 일부로 반환됩니다.
비밀번호 확인을 위해 Password_verify() 또는 crypt() 함수에서 직접 사용할 수 있습니다.
솔트의 또 다른 용도는 사용자를 식별하는 쿠키를 만드는 데 사용될 수 있다는 것입니다.
예를 들어 데이터베이스를 기반으로 맞춤형 쿠키 세션 메커니즘을 구현하는 경우는 다음과 같습니다.
이 쿠키는 사용자를 인증할 뿐만 아니라 또한 위조나 크랙이 불가능합니다.
bcrypt를 사용하세요. PHP 5.5.0에는 기본 알고리즘이 있습니다.
<code>//保护用户密码的盐 $salt = sha1( uniqid(getmypid().'_'.mt_rand().'_', true) ); //数据库保存的用户密码($pwd_user是用户输入的密码明文) $pwd_db = sha1($salt.sha1($pwd_user)); //cookie里的盐 //其中$global_salt是配置里定义的全局盐,用来保护用户的盐,一旦修改,所有用户的cookie都将失效. $cookie_salt = sha1($global_salt.sha1($salt)); //最终生成的cookie内容 $cookie = base64_encode($user_id.'|'.$cookie_salt); //如果你需要高安全性,还可以使用MCRYPT_BLOWFISH对整个cookie的内容做一次加密. $cookie = mcrypt_blowfish($cookie, $key); //设置cookie,这里把过期时间设为604800秒(60*60*24*7,一周) setcookie('sessid', $cookie, time()+604800, '/', '', false, true); //解密cookie $cookie = mdecrypt_blowfish($_COOKIE['sessid'], $key); //解码分割后拿到里面的$user_id和$cookie_salt $cookie = explode('|', base64_decode($_COOKIE['sessid'])); list($user_id, $cookie_salt) = $cookie;</code>
http://zhuanlan.zhihu.com/p/2...