2012-02-15 2 views
0

PHP에서 사용자가 마스터 비밀번호를 사용하여 비밀번호 세트를 저장하고 액세스 할 수있는 비밀번호 관리자를 구축 중입니다. 데이터베이스는 mcrypt를 사용하여 암호화되고 디스크에 저장된 간단한 XML 파일입니다.PHP 세션에서 암호화 된 데이터 편집하기

편집 : 각 사용자마다 고유 한 데이터베이스 파일이 있습니다.

문제는 다음과 같습니다. 사용자가 암호 중 하나를 편집하면 데이터베이스의 암호를 해독하고 변경하고 다시 암호화해야합니다. 사용자가 무언가를 편집 할 때마다 데이터베이스에 액세스하기 위해 그의 마스터 비밀번호를 알아야하므로 서버의 어딘가에 비밀번호를 임시로 저장해야하거나 사용자가 모든 변경 사항을 입력해야합니다.

세션 변수에 암호를 저장하면 보안 문제가 발생할 수 있다는 것을 알고 있습니다. 보안 문제가 발생할 수 있으므로 안전한 방법이 있습니까?

참고 : 프로젝트를 호스팅하는 서버에 대한 루트 또는 물리적 액세스가 없으므로 구성을 변경할 수 없습니다.

+1

왜 실제 데이터베이스를 사용하지 않습니까? –

+0

왜 데이터베이스에 액세스하기 위해 마스터 비밀번호가 필요합니까? 데이터베이스를 찾고 그것을 여는 데 사용할 수있는 사용자 아이디가 아닌가? – dqhendricks

+0

@ 대각선, 내가 가지고있는 유일한 다른 옵션은 MySQL이지만, 나는 암호화 문제를 해결하지 못할 것이라고 생각합니다. – chrisklaussner

답변

1

완전히 다른 옵션은 일반 텍스트를 서버 나 디스크에 저장하지 않는 것입니다. 클라이언트에 제공하는 JavaScript는 입력 한 마스터 비밀번호를 기반으로 클라이언트의 브라우저에서 데이터를 완전히 암호화/해독하는 데 사용할 수 있습니다 (따라서 마스터 비밀번호도 전송되지 않습니다 - 두 사람 사이의 비밀은 다음과 같은 경우에만 기억됩니다 if 하나는 죽었다!).

서버에서는 암호화 된 버전의 데이터 만 저장합니다. 데이터는 사이트에 게시 될 때 암호화됩니다. 사이트 서버가 브라우저에 데이터를 보내면 여전히 데이터가 암호화됩니다.

보안 문제를 해결합니다. 적극적으로 악의적 인 웹 서버는 사용자가 자바 스크립트로 초기 페이지를로드하는 경우에만 보안을 손상시킬 수 있습니다. 수동 공격자 (서버의 전체 시스템 메모리를 항상 볼 수 있다고하더라도)는 보안을 손상시키기 위해 아무 것도 할 수 없습니다.

사용자가 사이트에 로그인하여 (데이터 암호 텍스트에 액세스 할 수있게하려면) 또는에 별도의 암호 (예 : 소금 포함)를 사용할 수 있습니다. 서버에 전송하기 전에 마스터 비밀번호 (해시를 저장하고 다시 소금에 절여 있어야 함).

0

암호를 직접 암호화 키로 사용하지 않는 것이 좋습니다. 다음과 같이 시도하십시오.

$_SESSION['myKey'] = md5($_POST['userName'] .$_POST['password']); //create a hash based on multiple predictable criteria 

... 그런 다음 암호 대신 $ _SESSION [ 'myKey']를 사용하십시오. 이렇게하면 노출되지 않고 세션 상태에서 키를 유지할 수 있습니다.

+0

이렇게하면 마스터 비밀번호를 보호 할 수 있지만 실제로 암호화 된 데이터 자체의 보안은 향상되지 않습니다. – Kitsune

+0

동의합니다. 암호화 된 데이터는 키 및 암호화 알고리즘만큼 안전합니다. 즉, 내 선호하는 방법이 아닌, 앱을 실행시키는 더 좋은 방법으로 전달하는 것입니다. 나는 DB에 있어야한다고 다른 사람들과 동의한다. – AlexC

1

일단 마스터 암호를 디스크에 저장하면 암호화가 전혀 필요 없으며 성능이 저하됩니다.

누군가가 세션 기간 동안 HDD를 꺼냈다면 쉽게 암호를 사용하여 파일을 열 수있었습니다.

거친 관리자가되면 파일 열기 전에 비밀번호를 저장할 수 있기 때문에 방금 완료했습니다. 그래서 나는 관리자가 당신쪽에 있다고 가정하고 시스템을 잘 구성했습니다.

주먹 할 수있는 일은 disk encryption입니다. 실제로 보안이 많이 향상됩니다. 누군가가 세션에서 일반 텍스트 암호로 HDD를 훔쳤다면 어쨌든 그것을 읽을 수 없습니다.

HTTPS를 사용하는 것보다 ... HTTP를 사용하는 경우 비밀번호로 작업 할 때 필수이며 전체 계획이 쓸모가 없어야합니다.

PHP에서 ... 나는 당신이 할 수 있는지 잘 모르겠습니다. 당신이 HTTPS를 사용하지만이 작업을 수행 할 수 있습니다

  • 저장소 암호 $pass
  • 임시 랜덤 암호화 키를 생성 $rand에 의해 암호화 ($rand)
  • 저장소 암호는
  • (난 그냥 XOR을 사용) $_COOKIE 변수
  • 사용 $_COOKIE 값으로 저장 $rand 모든 요청 마스터 암호 해독

예 :

$pass = 'iddqd'; 
$rand = 'abcde'; 
echo base64_encode($pass^$rand); // CAYHFQE= 
$_COOKIE['phrase'] = $rand; 
$_SESSION['password'] = base64_encode($pass^$rand); 
unset($pass); 

// And on every other request: 
$pass = $_COOKIE['phrase']^base64_decode($_SESSION['password']) 

는 부가가치 무엇입니까?일반 텍스트로 암호를 저장하는 것은 인증 된 디스크 액세스에만 의존합니다.

임시 구문을 생성하여 사용자 브라우저에만 저장하면 (사용자 측에서만) 인증 된 디스크 액세스 + 사용자 인증시 생성 된 쿠키 값 (스푸핑하기가 어려워야 함)에 의존합니다.

그리고 한 가지 더 많은 것은 https를 사용할 때 각 요청에 구문 문구를 보낼 때 걱정할 필요가 없습니다. (10-100-1000 요청마다 변경할 수 있음)

관련 문제