워드 프레스 옵션 DB에서 API에 사용자 이름과 비밀번호를 저장하는 방법은 무엇입니까?


19

현재 플러그인을 개발 중이며 다른 사람들이 사용할 수 있도록 공개 플러그인 저장소에서 릴리스 할 가능성이 높습니다.

플러그인은 API를 사용하며이 API를 사용하려면 사용자 이름과 비밀번호를 전달해야합니다. 따라서 플러그인은 이러한 로그인 자격 증명을 데이터베이스에 저장해야합니다. API가 일반 텍스트로 필요하지만 일반 텍스트로 저장하고 싶지 않습니다.

그래서 제 질문은 이러한 민감한 정보를 어떻게 저장합니까? 해싱이 종료되었으므로 일종의 암호화 여야합니다.

WordPress에는 블로그마다 다른 고유 키가 있습니까? 암호화 및 암호 해독에 어떤 PHP 기능을 사용해야합니까? 모든 WP 설치에서 작동하는 것보다 더 많은 기능을 찾고 있습니다.


3
이것은 다소 해결할 수 없습니다. 되돌릴 수 있어야하는 암호화 량은 중요하지 않습니다. WP가 암호를 해독 할 수 있고 WP가 손상된 경우 암호화는 중요하지 않습니다.
Rarst

그러나 API가 비밀번호를 알아야하는 이유는 무엇입니까? API가 사용자가 비밀번호를 알고 있음을 알고 있으면 충분하지 않습니까?
onetrickpony

1
@One Trick Pony-사용자 개입없이 프로세스를 자동화 할 수 있도록 비밀번호를 저장해야합니다.
Brady

1
@Rarst-WP가 손상된 경우 암호도 알고 있습니다. 나는 이것을 막을 수 없다. 내가 막을 수있는 것은 SQL 덤프가 얻어지면 암호가 일반 텍스트가 아니라는 것입니다.
Brady

@Brady yep, SQL 덤프 손상 되면 암호화가 도움이됩니다. 그러나 그러한 시나리오는 거의 없습니다. 데이터베이스 액세스 권한이 있으면 WP도 손상시키는 것이 쉽지 않습니다.
Rarst

답변:


4

이전 답변에 동의하지만 실제로 묻는 질문에 대답하려면 wp-config.php에 다음 상수 중 하나를 사용하는 것이 좋습니다.

define ( 'AUTH_KEY', '편집 됨');
define ( 'SECURE_AUTH_KEY', '편집 됨');
define ( 'LOGGED_IN_KEY', '편집 됨');
define ( 'NONCE_KEY', '편집 됨');

이들은 워드 프레스 설치에서 고유해야하며 워드 프레스에서 기존 키를 찾을 수있는 유일한 옵션에 관한 것입니다. 다른 방법은 관리자 이메일 주소 나 그와 비슷한 것 중 하나를 해시하고 숨겨진 설정 옵션에 저장하여 자신의 유사한 상수를 추가하여 누군가가 실수로 키를 수정 한 경우 키가 손실되는 것을 방지합니다 플러그인이 설치되었습니다. 위험은 초기 설치에서 고유하지 않았지만 관리자 / 사이트 소유자가 실제로 실패 후 오류를 수정하기로 결정한 경우 실수로 비밀번호 암호화를 해제해서는 안됩니다.

암호화 / 복호화 기능과 관련하여 빠른 Google 검색은 청구서에 맞는 코드와 함께 다음 목록을 반환합니다. http://maxvergelli.wordpress.com/2010/02/17/easy-to-use-and-strong- 암호화 해독 PHP 기능 /

암호화 기능 ($ input_string, $ key) {
    $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND);
    $ h_key = 해시 ( 'sha256', $ key, TRUE);
    return base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ h_key, $ input_string, MCRYPT_MODE_ECB, $ iv));
}

decrypt 기능 ($ encrypted_input_string, $ key) {
    $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND);
    $ h_key = 해시 ( 'sha256', $ key, TRUE);
    리턴 트림 (mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ h_key, base64_decode ($ encrypted_input_string), MCRYPT_MODE_ECB, $ iv));
}

여기에 사용 된 AES 암호화에 대한 문서가 있습니다 : http://www.chilkatsoft.com/p/php_aes.asp


4

이것이 바로 OAuth가 설계된 환경입니다.

로부터 의 OAuth 홈페이지 :

서비스 제공 업체 개발자의 경우 ...

당신이 지원하는 경우 ...

  • 웹 애플리케이션
  • 서버 측 API
  • 매시업

보호 된 데이터를 사용자 대신 저장하는 경우 액세스 권한을 얻기 위해 웹에 비밀번호를 확산시키지 않아야합니다. OAuth를 사용하여 계정 자격 증명을 보호하면서 사용자에게 데이터에 대한 액세스 권한을 부여하십시오.

OAuth의 장점은 사용자의 비밀번호를 저장할 필요가 없다는 것입니다. 처음 플러그인을 설정하면 애플리케이션 (일반적으로 API와 동일한 서버에서 호스팅되고 페이지 리디렉션, thickbox 또는 iframe에로드 된 페이지)을 통해 사용자 이름과 비밀번호로 로그인하라는 메시지가 표시됩니다. .

사용자가 로그인하면 서버 (시스템)는 시스템 (WordPress)이 API와 인터페이스하는 데 사용할 수있는 보안 키를 만듭니다. 이 키는 사용자 계정과 사이트에 고유하며, 인증 정보를 매번 전달하지 않고 사용자 대신 API로 작업을 수행 할 수있는 응용 프로그램 (WordPress의 응용 프로그램)을 제공합니다 .

이 예제를 실제로 보려면 Jetpack을 확인하십시오 .

플러그인을 활성화하면 연결되지 않았다고 불평합니다. "연결"하면 WordPress.com을 통해 자격 증명을 입력하고 WordPress와 해당 API 간의 OAuth 상호 작용을 설정합니다.

그러나이 작업을 한 번만 수행하면 WordPress.com 사용자 이름 / 암호가 로컬 WordPress 데이터베이스에 저장 되지 않습니다 .


1
이것을 사용하는 것이 좋지만 내가 다루는 API는 내 것이 아니며 OAuth 시스템이 없습니다.
Brady

1
이 경우 유일한 옵션은 암호를 DB에 저장해야한다는 것과 암호의 암호화 여부가 실제로 보안과 크게 다르지 않다는 것입니다. 위에서 언급했듯이, 데이터베이스에 있고 암호화가 되돌릴 수 있다면 워드 프레스 (법적 또는 해킹 된)에 액세스 할 수있는 사람은 누구나이를 보유 할 수 있습니다.
EAMann

0

많은 서비스가 여전히 OAuth를 지원하지 않고 옵션 데이터베이스에 비밀번호를 저장하면 모든 단일 Wordpress 플러그인에서 비밀번호를 읽을 수있게되므로 이는 중요한 문제입니다 (위의 설명 참조).

이것은 (아직) 질문에 대한 실제 답변이 아니라 너무 길어서 주석입니다. 이 "해결할 수없는"문제에 대한 "최고의"가능한 해결책을 제시하기 위해 이에 대한 논의를 시작하고자합니다.

암호를 암호화 할 수 있다고 생각하는 기본 아이디어는 다음과 같습니다.

모든 사용자가 가지고있는 비밀 정보는 워드 프레스 암호입니다. 암호로 비밀로 변환 된 형식으로 암호화 된 타사 서비스에 자격 증명을 저장하고 사용자가 로그인 할 때만 암호를 해독 할 수 있어야합니다.

이런 식으로 최소한 Wordpress 파일 및 데이터베이스의 복사본에서 암호를 도용하는 것이 불가능해야합니다. 모든 플러그인은 로그인 중에 일반 텍스트 비밀번호를 캡처 할 수 있으므로 신임 정보를 도용하는 다른 플러그인의 문제점을 해결할 수 없습니다.

실제로는 해독하기가 다소 쉽습니다. 데이터베이스에 저장된 타사 서비스의 암호화 된 버전이 이미 있다고 가정하고 'authenticate'필터에 연결하거나 wp_authenticate()함수 를 덮어 써서 일반 텍스트 사용자 비밀번호의 솔트 해시를 생성 할 수 있습니다. 를 wp_hash_password()사용하여 해시 된 비밀번호를 사용자가 로그 아웃 할 때까지 비공개 위치의 암호화 키로 저장합니다 ('wp_logout' 키를 삭제)과 우리가 데이터베이스에 암호화 된 값을 해독하는 타사 암호가 필요 때마다 사용하는 훅을.

이 작업을 수행 할 수 있어야한다는 느낌이 들지만 해결되지 않은 몇 가지 문제가 있습니다.

  1. 암호화는 어떻게합니까? 잠재적으로 사용자가 로그 아웃하고 다시 로그인 할 때까지 일반 텍스트 비밀번호를 저장할 수 있으며'authenticate' 합니다. 이 문제가 발생할 때까지 기간을 유지하려면 로그인하라는 메시지가 표시 될 수 있습니다.
  2. 키를 저장할 위치와 로그 아웃 중에 키를 삭제하는 방법은 무엇입니까? 'authenticate'사용자가 실제로 로그인 할 때만 실행 되는 것으로 이해 합니까?
  3. 해시 된 암호를 저장하는 방법이 있다면 대신 세션 쿠키에서 키를 파생시킬 수 있습니까?
  4. 비밀번호 변경은 누가 처리합니까? 잡을 수있을 것 같습니다이러한 비밀번호 변경 사항 새 비밀번호에서 파생 된 키로 타사 비밀번호를 다시 암호화해야합니다.
  5. 다중 사용자 지원을 제공 할 수있는 방법이 있습니까? 이상적으로는 관리자 사용자가 설정에서 타사 암호를 설정하여 권한이 적은 사용자가 타사 서비스와 상호 작용하기 위해이 암호를 공개하지 않더라도 고소 할 수 있기를 원할 것입니다. 이를 위해 관리자는 다른 사용자가 자신 만 생성 할 수있는 모든 사용자에 대한 키를 생성 할 수 있어야합니다. 어떻게 든 가능합니까?
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.