문제

이 질문은 오히려 인기 있는,나는 그것에게 그것이 업데이트합니다.

게 강조하는 정답 에 의해 주어진 AviD 이 질문:

당신이 해야하지 않는 모든 필요한 데이터는 암호화에는 쿠키입니다. 대신에,매장기(128 비트/16 바이트)임의의 핵심에서 쿠키가 저장 당신이 원하는 정보를 유지하는 안전한 서버에서 확인해 쿠키의 열쇠이다.



내가 찾는 정보에 대해'최고의 암호화 알고리즘에 대한 암호화하는 쿠키입니다.

I hava 다음과 같은 요구 사항:

  • 그것은 빨라야
    암호화하고 해독하는 데이터가 수행하는(거의)모든 요청

  • 그것은 작동에 작은 데이터 세트 일반적으로 문자열의 약 100 문자 또는 덜

  • 그것은 보안,하지만 그것처럼 우리는 금융 거래를 확보

  • 우리는 할 수 있어야 해독하는 정보를 그렇게 SHA1 와 같은이다.

지금 내가 읽는 것은 복어 빠르고 안전하게,그리고 내가 읽는 AES 가 빠르고 안전합니다.으로 복어는 작은 블럭의 크기.

나는 모두 알고리즘을 제공합보다 더 많은 충분한 보안은?그래서 속도 다음가 결정적인 요소입니다.하지만 내가 정말로 아무 생각이 없으면 그는 알고리즘에 적합한 작은 문자열이 있다면 어쩌면 더 적합한 알고리즘에 대한 암호화하는 쿠키입니다.

그래서 제 질문은:
어떤 암호화 알고리즘은 최고의 암호화하기 위한 쿠키 데이터는?

업데이트
더 정확하게하기 위해,우리가 암호화하고자 하는 2 개의 쿠키:하와 세션 정보 및 기타와의'기억'나는 정보.

플랫폼 PHP 으로 아파치 모듈에서 리눅스에 VPS.

업데이트 2
동의 는 저장하는 모든 정보에서 쿠키가 안전하지 않습니다.

그러나 우리는 요구 사항을 구현하는'remeber me'기능이다.허용되는 방법에 대해 이동하는 이 쿠키를 설정하여.면 클라이언트는 이 쿠키,그 또는 그녀가 허용되는 액세스와 시스템(almost)동일한 권한 경우에는 그/그녀가 제시하는 올바른 사용자 이름 비밀번호합니다.

그래서 우리는 적어도 암호화하고자 하는 모든 데이터를 쿠키에는:
a) 악의적인 사용자 읽을 수 없습니다 그의 내용
b) 악의적인 사용자 수를 제작 자신의 쿠키 또는 변경합니다.

(모든 데이터에서 쿠키가 삭제되고 유효성을 확인하기 전에 우리가 아무것도 그것으로,그러나 그것은 또 다른 이야기입니다)

세션 쿠키를 포함 sessionId/타임 스탬프 아무것도 없습니다.그것은 아마 없이 사용될 암호화,그러나 나는 아무에 해를 암호화하지?(다른 것보다는 계산 시간).

그래서 우리는 디스크에 데이터를 저장한 쿠키에는 가장 좋은 방법은 무엇입를 암호화하지?

업데이트 3
응답을 이 질문에 만들어 나에게 다시 선택한 접근 방식이다.나는 할 수 있는 실제로 동일하지 않고 필요한 암호화 합니다.대신 데이터를 암호화하는,나만 보내 데이터는 것은 의미가 없지 않고 그것의 컨텍스트 할 수 없는 짐작.

그러나 나도 상실:
내가 생각하는 암호화가 활성화되어 우리에게 보낼 데이터에 BigBadWorld™,그리고 아직도(공정)는 아무도 읽을 수 있는 손상 또는 그것...
지 않은 것 전체적인 포인트의 암호화?

하지만 반응은 아래를 향해 나아:을 신뢰하지 않는 암호화를 달성하는 보안이다.

나는 무엇??

도움이 되었습니까?

해결책

실제하지 않을 이유로 이동 AES 256 비트입니다.를 사용할 수 있는지 확인 이 CBC 드, 고 PKCS#7 편리합니다.당신이 말했듯이,빠르고 안전합니다.

내가 읽기(테스트)는 복이 될 수 있는 소폭 빠른...그러나 복어에는 중요한 결점의 설치 시간이 할 수 있는 것이다 나쁜 상황이다.또한,AES 더 많은"시험".

이는 그것이 정말로 에 필요한 대칭 암호화하는 쿠키 데이터입니다.으나,그것이 정말로 해서는 안될 필요하고,거기에 몇 가장자리가 있는 경우에 없는 다른 선택이 그러나 그렇게했다.일반적으로,그것은 더 나은 당신에 맞게 디자인을 변경하거나 임의의 세션 식별자 또는 필요한 경우나 해시(SHA-256 을 사용하).
귀하의 경우,외"일반"무작위 세션 식별자,당신의 문제는"기억하기"기능을 이해야로 구현하는 것 중 하나:

  • 장 임의의 번호,저장된 데이터베이스에 매핑된 사용자 계정
  • 또는 키 해시(예를들면HMAC)을 포함하는 예:사용자 이름,타임스탬프,mebbe 솔트 및 비밀이 서버 핵심이다.이 과정의 모든 확인할 server-side...

는 것처럼 우리는 조금 떨어져 화제의 원본,특정 질의 변경의 기준으로 귀하의 질문에 변경하여지는 디자인으로 되어 있습니다.
그래서 우리가 하고 있는데,강력하게 추천 이 기능을 영구 기억","나는 여러 가지 이유로,가장 큰 그 중:

  • 그것은 훨씬 더 가능성이 있는 누군가 훔칠 수 있는 사용자의 기억 키할 수 있도록을 위조은 사용자의 신원(그리고 다음은 아마 자신의 비밀번호를 변경);
  • CSRF - 십자가 요청 위조트.귀하의 기능을 효과적으로 허용 익명으로 공격자를 원인은 무지한 사용자는 제출하"인증된"요청 응용 프로그램,도 되지 않고 실제로 기록됩니다.

다른 팁

이에 닿는 별개의 문제이다.

첫째, 세션 납치.이것은 세 번째 파티를 발견,말,인증된 쿠키 및에 대한 액세스 권한을 얻을 다른 사람의 내용.

둘째,가 세션 데이터 보안.이 뜻으로 저장되는 데이터를 쿠키에(같은 사용자명).이것은 좋은 생각이 아니다.이러한 데이터가 근본적으로 신뢰할 수처럼 HTML 형태로 데이터가 신뢰할 수 없는(에 관계없이 무엇 Javascript 검증 및/또는 HTML 길이 제한,당신이 사용하는 경우)기 때문에 클라이언트가 무료로 제출 그들이 원하는 것을하는 것입니다.

당신이 자주 찾는 사람들(바로)옹호 소독 HTML 형태로 데이터나 쿠키 데이터는 맹목적으로 받아들 얼굴에 값입니다.큰 실수입니다.사실,저장하지 않는 모든 정보는 쿠키입니다.내가 보기에 세션은 열쇠 그리고 그게 전부입니다.

하려는 경우에 데이터를 저장하는 쿠키가 당신은 당신을 다시 생각해 보십시오.

의 암호화 이 데이터를 만들지 않는 정보가 더 이상 trustworth 기 때문에 대칭 암호화에 취약 무작위 공격합니다.분명히 AES-256 보다 더 나은,말,DES(heh)그러나는 256 비트의 보안을 의미하지는 않는만큼 당신이 생각하는 않습니다.

한 가지,소금은 일반적으로 생성에 따른 알고리즘은 그렇지 않으면 감염을 공격합니다.

다른 쿠키 데이터는 총리 후보에 대한 침대 공격입니다.면 그것은 잘 알려진 또는 의심되는 사용자 이름 암호화된 데이터를 야기하는 침대.

이 첫 번째 요점:납치.

그것은 지적해야한다는 공유된 호스팅 환경에서 PHP(예로 들어보)당신의 세션 데이터는 단순히 저장된 파일 시스템에는 읽을 수 있는 누군가에서는 동일한 호스트에 있지만 그들은 알 필요가 없는 사이트입니다.그래서 절대 저장할 암호를 그대,신용 카드 번호,광범위한 개인정보 또는 아무것도할 수도 있는 것으로 간주 민감한 세션에서 데이터는 그런 환경에 있지 않고 어떤 형태의 암호화하거나,더 나은 아직,다만 저장하는 키션 및 저장을 실제 중요한 데이터베이스에서.

참고: 위은 고유하지 않습니다.

하지만 그 서버 측의 암호화 합니다.

지금 주장할 수 있는 암호화 세션과 함께 몇 가지 여분의 데이터는 것이 더 안전부터 납치.일반적인 예는 사용자의 IP 주소입니다.문제는 많은 사람들이 동일하게 사용하는 PC/노트북에서는 많은 서로 다른 위치(예를 들어 무선 랜 핫스팟,작동,집).또한 많은 환경에서 사용하는 다양한 IP 주소를 원본으로 주소,특히 기업의 환경입니다.

할 수 있도를 사용하여 사용자 에이전트지만 그의 추측.

그래서 정말로 멀리로 말할 수 없는 진짜 이유를 사용하는 쿠키 암호화에서 모두.내가 결코하지 않았다고 생각이 있었지만 이 질문을 찾아 나섰을 입증 마우스 오른쪽 버튼으로 또는 잘못입니다.내가 발견되는 몇 가지 스레드가 사람에 대한 제안을 암호화하는 방법 쿠키 데이터,투명하게 할것으로 아파치 모듈이고,그래서 그러나 이러한 모든 듯 동기 부여하여 저장된 데이터를 보호하는 데에서 쿠키(는 이럴 때 하면 안된다).

저는 아직 보안 인수를 암호화하기 위한 쿠키를 나타내는 아무것보다 더 세션 키입니다.

나는 행복하게 잘못 입증하면 사람이 할 수 있습니다 뭔가를 반대입니다.

보안 경고:이러한 두 가지 기능 안전하지 않습니다.그들은 사용 ECB 드 하지 못할 인증 암호문.보 이 답변 에 대한 더 나은 방법입니다.

그를 통해 읽고 이것을 사용하고자하는 방법에 PHP 스크립트가 있습니다.여기에 들어 사용하는 256 비트 Rijndael(지 AES).

function encrypt($text, $salt) 
{ 
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); 
} 

function decrypt($text, $salt) 
{ 
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $salt, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))); 
}

다음을 저장하는 쿠키

setcookie("PHPSESSION", encrypt('thecookiedata', 'longsecretsalt'));

과에서 읽을 다음 페이지:

$data = decrypt($_COOKIE['PHPSESSION'], 'longsecretsalt');

를 달성할 수 있 당신이 원하는 무엇을 안전하게 사용하여 AES 에 EAX 모니다.암호문보다 큰 것입니다 일반 텍스트;의 정상에 대한 안전한 암호화 합니다.

공격자는 물론 알고의 길이는 당신의 일반 텍스트에서 암호문,하지만 그들은 할 수 없을 확인할 수 있다.

생 AES 키습니다.

확인하고 사용할 신선한 nonce 각 암호화를 사용하여"관련된 데이터는"현장을 보장하는 것은 당신이 암호화된 하나의 목적을 위해서는 표시되지 않는 것으로 다른(그래서 같은 것을 사용자 이름과 쿠키 이름이 거기에 갈 수 있다)

의 반응이 아래를 향해 나아:마 신뢰 암호화하여 달성 보안입니다.

더 많은"만약 당신이하지 않는 암호화 전문가 당신이 얼마나 쉬운 그것은 잘못된".예를 들어,AFAICT 아무도 다른 사람이 스레드에 있는 논의하는 모듈 또는 메시지 무결성을 다루는 두 개의 일반적인 초보자의 실수를 합니다.

빠르고,암호화된 쿠키 Libsodium

필요한 경우 빠르고,안전하게 암호화된 쿠키는 PHP 에서 확인하는 방법 Halite 을 구현합니다.Halite 에 의존 이 libsodium PECL 확장 제공하는 안전한 암호화를 사용합니다.

<?php
use \ParagonIE\Halite\Cookie;
use \ParagonIE\Halite\Symmetric\Key;
use \ParagonIE\Halite\Symmetric\SecretKey;

// You can also use Key::deriveFromPassword($password, $salt, Key::CRYPTO_SECRETBOX);
$encryption_key = new SecretKey($some_constant_32byte_string_here);

$cookie = new Cookie($encryption_key);

$cookie->store('index', $any_value);
$some_value = $cookie->fetch('other_index');

설치할 수 없는 경우 PECL 확장,게 물어버나 호스팅 제공하는 당신을 위해 그것을 할 수 있습니다.그들이 거절하면,당신은 아직이 옵션이 있습니다.


안전한 암호화된 쿠키는 PHP 에서 소금을 보유하십시오

다른 답변이 지시하신 데이터를 암호화된 openssl 이나 mcrypt,하지만 그들은 누락된 중요한 단계입니다.하려는 경우 을 안전하게 데이터를 암호화 PHP, 신 인증 귀하의 메시지입니다.

를 사용하는 OpenSSL 확장,프로세스를 필요에 따라 다음과 같습니다:


Preamble

  • (당신이 생각 하기 전에 대해 암호화)를 생성하는 128 비트,192 비트 또는 256 비트 임의의 문자열입니다.이 될 것입니다 master key.

    를 사용하지 않는 인가 읽을 수 있는 암호입니다. 는 경우,어떤 이유로, 사람이 읽을 수 있는 암호를 물어 암호화 SE 을 위해 안내합니다.

    는 경우에 특별한 주의가 필요,나의 고용주가 제공하는 기술 컨설팅 서비스, 포함하여 개발의 암호화 기능.

암호화

  1. 를 초기화하는 벡터(IV)또는 nonce.예: random_bytes(openssl_cipher_iv_length('aes-256-cbc'))
  2. HKDF 또는 이와 유사한 알고리즘에 대한 분할하으로 두 개의 열쇠:
    1. 암호화 키($eKey)
    2. 는 인증 키($aKey)
  3. 암호화된 문자열 openssl_encrypt() 과 IV 고 적절한 modate(예: aes-256-ctr 를)사용하여 암호화 키($eKey 에서)2 단계.
  4. 컴퓨팅 인증 태그의 암호문에서 3 단계를 사용하여 키 해쉬와 같은 기능 HMAC-SHA256.예: hash_hmac('sha256', $iv.$ciphertext, $aKey). 그것은 매우 중요한 인증을 암호화 후,그리고 캡슐화하 IV/nonce 니다.
  5. 패키지 인증 태그 IV 또는 nonce 며,암호문을 함께 선택적으로 인코딩을 가진 bin2hex()base64_encode().(주의:이 방법 누출 캐시 타이밍 정보.)

암호 해독

  1. 분할의 핵심으로 2 단계에서 암호화 합니다.우리가 필요한 동일한 두 개의 열쇠 암호 해독 중에!
  2. (선택적으로,디코딩)압축을 풉 MAC,IV,및 암호문에서 포장하는 메시지입니다.
  3. 지 확인하는 인증표에 의해 다시 계산 HMAC IV/nonce 및 암호문으로 사용자가 제공하는 HMAC 를 사용하여 hash_equals().
  4. 는 경우에만 3 단계를 통과 해독을 사용하여 암호문 $eKey.

하려면 어떻게 돌아가는지를 확인하려면 모두 함께 참조하십시오 이 대답은 샘플 코드.

만약 이 같은 소리가 너무 일을 많이 사용 해체/php-암호화젠-crypt 다.


Remember Me 쿠키

그러나 우리는 요구 사항을 구현하는'remeber me'기능이다.허용되는 방법에 대해 이동하는 이 쿠키를 설정하여.면 클라이언트는 이 쿠키,그 또는 그녀가 허용되는 액세스와 시스템(almost)동일한 권한 경우에는 그/그녀가 제시하는 올바른 사용자 이름 비밀번호합니다.

암호화를 실제로 올바른 도구를 이 작업입니다.당신이 따라하고 싶은 이 프로세스 안전한 저를 기억에서 쿠키를 PHP:

를 생성하는 토큰

  1. 를 생성하는 두 개의 임의의 문자열:
    1. A selector 에 사용되는 데이터베이스를 조회.(의 목적으로 임의 선택을 순차적 ID 가 누출에 얼마나 많은 활성 사용자가에 당신의 웹 사이트입니다.당신은 편안한 유출이 정보를 사용하여 순차적 ID 입니다.)
    2. A validator 사용되는 사용자를 인증하고 자동으로 합니다.
  2. 계산의 해시 validator (는 간단하 SHA-256 해시 충분할 것이다).
  3. 저장 selector 고의 해시 validator 데이터베이스에 테이블을 위해 예약 자동 로그인합니다.
  4. 저장 selectorvalidator 쿠키에에서 클라이언트입니다.

사용 토큰

  1. 분할 들어오는 쿠키를로 selectorvalidator.
  2. 데이터베이스를 수행 조회(사용 준비된 문의!) 에 따라 selector.
  3. 는 경우 행견을 계산하는 해시 validator.
  4. 비교 hash 를 계산하여 3 단계에서 해쉬에 저장된 데이터베이스를 사용하여 다시 한 번 hash_equals().
  5. 으면 4 단계 true 를 반환합니다,로그는 사용자에 적절한 계정입니다.

이것은 전략 문지 채용 장기적인 사용자 인증 그리고 그것은 가장 안전한 전략 제안을 위한 이러한 요구사항이 충족.

하는 동안 모두 매우 강한 사람,AES 은 표준입니다.

으로의 보안을 위해 작은 조각의 데이터:작은 더 나은입니다.적 암호화된 데이터에 노출되고,더 이상 사용할 수 있는 키입니다.은 항상있는 이론적 제한이 얼마나 많은 데이터를 암호화할 수 있습니다 내 하나의 열쇠를 주어 알고리즘을 노출시키지 않고 시스템을 위험이 있습니다.

를 암호화하는 경우 쿠키,서버는 여전히 이를 디코딩하여 그것을 읽(을 확인에 대한 동일한 핵심),따라서 어떤 암호화된 쿠키는 것은 무의미하기 때문에,도난당한 경우(및 un 편집)그것은 아직도 지도 해커가 바로 당신의 계정입니다.로 안전하지 않으로 암호화됩니다.

내가 믿는 진짜 문제는 누군가 훔치는 쿠키가 사이의 연결을 서버와 클라이언트입니다.사용 SSL 연결에서 제공하는 호스트.

로 당신의 쿠키를 만들 필요가 있는 오래 무작위 id 당 사용자에서 데이터베이스(그것을 변경하는 모든 로그온)와 그냥 집으로 쿠키나 세션이 있습니다.쿠키를 포함하는 키을 통해 확인할 수 있습니다 php 와 같은 경우에는 계정 또는 테이블에서 데이터베이스,덤프트 데이터 웹 페이지에서 다음과 같 정상입니다.

지적으로 몇 시간 이전에,의견,당신 적용 무결성을 보호 어떤 암호문을 보낼 사용자에게 받아들이다.그렇지 않으면 보호할 수 있는 데이터의 수정 또는 암호화 키를 복구됩니다.

특히 PHP 세계 전체의 예시(참조하십시오 PHP 암호화면 관리 다)하지만 이는 적용된 언어입니다.

하나의 몇 가지 좋은 예를 내가 본 PHP-CryptLib 을 사용하는 결합된 암호화-인증 모드를 작업을 수행합니다.파이썬 pyOCB 제공하는 동일한 기능을 수행할 수 있습니다.

왜 당신은 당신을 암호화하는 쿠키?

그것을 보고,다음과 같은 두 가지 경우가 있습니다:거나 당신에게 클라이언트 키,또는 당신은하지 않습니다.

포기하지 않는 경우 키 클라이언트에게 다음 당신은 왜 그들을 주는 데이터가?지 않는 한 당신이 몇 가지 이상한 게임을 깨고 약한 암호화(는 당신이 명시적으로하지 않),너뿐만 아니라 데이터를 저장하고 서버에 있습니다.

는 경우 손으로 클라이언트가 열쇠 그 다음 당신은 왜 그것을 암호화에서 첫 번째 장소는?지 않는 경우에 암호화 통신의 핵심,다음을 암호화하는 쿠키는 논:는 결코 더 쉬웠에서 볼 수 있는 쿠키와 의한 경우가 아니고서는 보 쿠키게 되었습니다.당신이 사용하는 경우에 암호화된 채널을 클라이언트는 이유는 추가의 오버헤드를 암호화 저장된 데이터가?

당신이 걱정하는 경우 다른 사용자 실행하면 클라이언트 컴퓨터에 쿠키를 읽어서,주고 가정 브라우저 좋은 설정한 권한 비트는 다음과 같습니다.)

AES(으로도 알려진 Rijndael)은 가장 인기가 있습니다.블록 크기는 128 비트,그만하는 16 바이트를,그리고 당신이 말하는"약 100 자".

내가 생각하는"멀리는"어떤 데이터를 암호화에 대해 때 사용자 이름과 비밀번호가 좋지 않다...많은 JS 할 수 있는 냄새는 그것...나는 당신이 사용자로 만들 DB 테이블 필드 cookie_auth 또는 무...

후 최초 로그인이 수집:현재:브라우저,IP,ans 일부의 자신의 소금 키스하는 호스트 이름 var...

해시를 만들고 매장에서는 필드...쿠키 설정...cookie"응답 비교"이러한 모든 함께 저장된 해고 수행하...

는 경우에도"누군가 훔치는"쿠키지를 사용할 수 있다:-)

도움이 되기를 바랍:-)

feha 비전입니다.하기

또한,시도했 mcrypt_encrypt 고 한 것을 명심하시기 바랍니다 것입니다.당신 base64_encode(mcrypt_encrypt(...)).

그리고 나중에,당신은 당신 base64_decode 과 출력을 암호화된 데이터(echo).당신은 아마이 있다고 보지 않는다.그러나,당신 mcrypt_decrypt( ... base64_decode($value) ).당신이 볼 원본 데이터입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top