2011-02-17 5 views
6

두 가지 소금이 있는데, 각 사용자는 데이터베이스의 사용자 정보와 함께 저장되는 고유 한 소금을 가지고 있습니다. 두 번째 소금은 웹 사이트 고유의 소금입니다. 두 가지 모두 암호를 해시하는 데 필요합니다.웹 사이트의 암호를 저장하는 가장 좋은 장소는 어디입니까?

문제는 어디에서 웹 사이트의 소금을 유지해야할지 모르겠다. 현재 해시 알고리즘을 실행하는 PHP 메소드에 있습니다. 나는 그것을/var/www/바깥의 파일에 보관하고 PHP를 열고 파일을 읽어야합니까? 데이터베이스에 저장해야하는 이유는 데이터베이스를 손상시킬 염려가 두 가지 염려가되지 않기 때문입니다.

제안 사항?

+0

config.php 파일의 상수로? – Jonah

답변

11

아직 언급되지 않은 옵션이 있습니까? 서버가 제공하는 환경 변수. httpd.conf 나 .htaccess에서 할 수 있습니다. 아파치가 .htaccess 파일을 제공하지 않기 때문에, 당신은

SetEnv WEBSITE_SALT 232lhsdfjaweufha32i4fv4239tauvkjn 

... 많은 그것을 숨기고에 대해 그 방법을 걱정하지 않아도 응용 프로그램에서 할 필요는 $salt = getenv('WEBSITE_SALT');입니다. 여기서 이점은 응용 프로그램에 투명하다는 것입니다 ...

+1

왜 모두가 당신을 상체로 보지 않았습니까? 이것은 굉장합니다! – Undo

+0

여기에서 문제가 발생할 수 있습니다. 대부분의 응용 프로그램에서 사용자는 "암호"또는 "letmein"과 같은 암호를 사용합니다. 같은 salt로 같은 값의 MD5 해시를 생성하면 동일한 해시 값이 생성되므로 공격자가 패턴을 감지하고 응용 프로그램에서 사용자 암호를 pwn 할 수 있습니다. 나는 파이썬의 hashlib와 같은 소금을 시도 : (아래 추출) '일반 텍스트 = '안녕하세요' 소금 = '232lhsdfjaweufha32i4fv4239tauvkjn' H1 = hashlib.md5 (소금 + 일반 텍스트) .hexdigest() H2 = hashlib.md5 (salt + plaintext) .hexdigest() print h1 == h2 >> True' –

5

예, 어딘가에 PHP 설정 파일에 저장하십시오. 웹 루트 디렉토리 위에있는 폴더에 보관하는 것이 더 바람직합니다.

0

절대 제공 할 수없는 파일에 웹 사이트 소금을 저장하는 것이 가장 좋습니다. 당신이 지적한대로 소금을 암호화하거나 다른 사람들과 함께 보관할 필요가 없습니다. 저장 한 파일이 요청되면 (루트 www가 작동하지 않는 한) 제공 될 수 없으며 적절한 권한이 설정되어 있는지 확인하십시오.

0

.php 파일 내 변수에 붙여 넣기 만하면됩니다. 추가 보안 별 무명의 작은 비트를 들어, (말) base64 인코딩 형식으로 저장할 수 있으며, 추가 보안 - 여분의 비트를 들어

$this_is_not_the_salt_you_are_looking_for = base64_decode(.... encoded salt string here ...); 

같은 완전히 무해 변수 뭔가를, 이름, webroot 외부에 .php 파일을 두어 어떤 이유로 웹 서버의 설정이 엉망이되어 원시 PHP 코드를 제공하기 시작하면 salt 정보가 들어있는 파일에 직접 액세스 할 수 없게됩니다.

-3

대부분의 사람들은 구성 파일에 상수 소금을 저장합니다. 이것은 괜찮지 만 SALT를 사용하는 요점은 데이터를 외부 소스에서 읽을 수 없게하는 것입니다.

저는 많은 사람들이 실제로 계정 필드에 데이터베이스에 소금을 저장하는 것을 보았습니다. 그래도 트위스트가 있습니다. 그것은 계정 생성시 고유하게 생성되므로 모든 사용자는 고유 한 소금을 가지고 있습니다.

소금에 관한 것이 아니라 데이터를 암호화하는 방법입니다.

sha1($password.md5(md5($password.md5($salt)))) 

소금을 사용해도이 문제를 해결할 수 없을 것입니다. 계정별로 고유하게 결정하면 데이터베이스에 저장하는 것에 대해 걱정할 필요가 없습니다. 암호화 과정이 확실한 지 확인하십시오!

+0

먼저, 한 해시 함수의 출력을 다른 해시 함수의 입력으로 직접 입력하지 마십시오. 그 좋지 않다. 둘째, 이상한보고있는 코드보다는 일반적인 스트레칭을하십시오. 자세한 내용은 [이 게시물을] (http://stackoverflow.com/questions/4948322/fundamental-difference-between-hashing-and-encryption-algorithms/4948393#4948393) ... 그리고 해시! = 암호화. 거대한 차이가 있습니다 ... – ircmaxell

+0

특수 수학 알고리즘을 사용하면 이중 암호 md5 해싱을 리버스 엔지니어링 할 수 있습니다 (특히 MD5가 더 이상 안전하지 않으므로) – xorinzor

관련 문제