it-gundan.com

어떤 유형의 인코딩 / 암호화가 사용되었는지 확인하는 방법은 무엇입니까?

사용중인 암호화/인코딩 유형을 찾는 방법이 있습니까? 예를 들어 비밀번호를 데이터베이스에 암호화 된 형식 (WeJcFMQ/8+8QJ/w0hHh+0g==). 사용중인 해싱 또는 암호화를 어떻게 확인합니까?

156
Karthik

예시 문자열 (WeJcFMQ/8+8QJ/w0hHh+0g==)는 16 바이트 시퀀스의 Base64 인코딩으로, 의미있는 ASCII 또는 UTF-8처럼 보이지 않음)입니다. If 암호에 저장된 값입니다- verification (실제로 "암호화 된"암호가 아니라 "해시 된"암호) 이것은 아마도 암호를 통해 계산 된 해시 함수의 결과 일 것입니다; 128 비트 출력을 가진 고전적인 해시 함수 MD5입니다.

이를 알 수있는 "일반적인"방법은 응용 프로그램 코드를 보는 것입니다. 응용 프로그램 코드는 비밀 키만큼 보호 할 수없고 보호 할 수없는 유형의 뚱뚱한 방식 (서버의 실행 파일, 어딘가 소스 코드 등)으로 구현됩니다. 리버스 엔지니어링은 "가야 할 길"입니다.

리버스 엔지니어링을 사용하지 않으면 몇 가지 실험을 통해 교육받은 추측을 할 수 있습니다.

  • 동일한 사용자가 자신의 비밀번호를 "변경"하지만 재사용하면 저장된 값이 변경됩니까? 그렇다면 값의 일부는 임의의 "소금"또는 IV (대칭 암호화 가정) 일 것입니다.
  • 값이 주어진 사용자의 비밀번호와 결정적이라고 가정하면 두 사용자가 동일한 비밀번호를 선택하면 동일한 저장된 값이 발생합니까? 그렇지 않은 경우 사용자 이름이 계산의 일부일 수 있습니다. 일치하는지 확인하기 위해 MD5 ( "username : password") 또는 기타 유사한 변형을 계산하려고 할 수 있습니다.
  • 암호 길이가 제한되어 있습니까? 즉, 40 자 암호를 설정하고 처음 39 자만 입력하여 성공적으로 인증 할 수없는 경우 모든 문자가 중요하며 이는 실제로는 암호임을 의미합니다. hashing, not- 암호화 (저장된 값은 암호를 확인하는 데 사용되지만 저장된 값만으로는 암호를 복구 할 수 없습니다).
140
Thomas Pornin

편집 : 방금 hashID 라는 매우 멋진 스크립트를 발견했습니다. 그 이름은 거의 그것을 묘사합니다.

~~~

일반적으로, 경험을 사용하여 교육적인 추측을하는 것은 이러한 일이 어떻게 이루어지는가입니다.

다음은 매우 많은 수의 해시 출력이 포함 된 목록으로, 각 출력이 어떻게 보이고 서명/패턴을 생성하는지 또는 광학적으로 확인하는지 알 수 있습니다.

처음 주목해야 할 두 가지 main 항목이 있습니다.

  • 해시의 길이 (각 해시 함수는 특정 출력 길이를 가짐)
  • 사용되는 알파벳 (모든 영어 문자입니까? 숫자 0-9 및 A-F이므로 16 진수입니다. 어떤 특수 문자가 있습니까?)

여러 암호 크래킹 프로그램 (예 : John the ripper)은 사용 된 알고리즘을 추측하기 위해 입력에 일부 패턴 일치를 적용하지만 이는 일반 해시에서만 작동합니다. 예를 들어, 해시 출력을 가져와 각 문자를 1 씩 회전하면 대부분의 패턴 일치 체계가 실패합니다.

68
john

게시 한 것은 16 바이트 (128 비트)의 기본 64 인코딩 데이터입니다. base 64가 인코딩되어 있다는 사실은 base 64가 암호화/해싱 알고리즘이 아니기 때문에 이진 데이터를 텍스트로 인코딩하는 방법이기 때문에 많은 것을 알려주지 않습니다. 이것은이 블록이 유용한 정보를 포함한다는 것을 의미합니다. 즉, 출력 길이는 16 바이트입니다. 이것을 일반적으로 사용되는 방식의 블록 크기와 비교하여 불가능한 것을 알아낼 수 있습니다. 지금까지 가장 일반적인 구성표는 다음과 같습니다.

다음으로해야 할 일은 다음 질문에 대한 답을 찾기 위해 다른 암호문 블록을 살펴 보는 것입니다.

  • 입력 길이가 다른 경우에도 모든 암호 텍스트의 길이가 동일합니까?

모든 블록의 길이가 같지 않으면 해싱 알고리즘이 아니라 암호화 알고리즘을보고있는 것입니다. 출력은 항상 기본 블록 크기의 배수이므로 16 바이트로 균등하게 나눌 수없는 블록이 있으면 AES가 될 수 없으므로 DES 또는 3DES) 여야합니다.

암호를 입력하고 출력을 관찰 할 수 있으면 매우 빠르게 결정될 수 있습니다. 17 자 암호를 입력하고 길이를 확인하십시오. 16 바이트에 MD5가 있으면 20 바이트는 SHA-1을 의미하고 24 바이트는 DES 또는 3DES, 32 바이트는 AES를 의미합니다.

26
Yaur

이것이 단순한 암호 해시라면 Google을 사용하여 암호를 해독 할 수 있습니다 . Base64는 슬래시와 더하기 기호를 모두 찾기가 어렵 기 때문에 먼저 해시를 16 진수로 변환 해 보겠습니다.

$ Perl -MMIME::Base64 -le 'print unpack "H*", decode_base64 "WeJcFMQ/8+8QJ/w0hHh+0g=="'
59e25c14c43ff3ef1027fc3484787ed2

이제 우리는 Google for it 을 할 수 있습니다. 현재 md5this.com 에서 한 번만 을 받고 있습니다. 물론이 게시물을 포함하여 더 많은 정보가있을 것입니다.

불행히도 (또는 아마도 귀하의 관점에 따라), 우리는 실제로 사전 이미지를 찾을만큼 운이 좋지는 않지만 (현재이 해시를 "크래킹 ..."으로 표시합니다), 그 목록에 있다는 사실은 전혀 그렇지 않습니다. 실제로 실제 암호의 무염 MD5 해시임을 강력히 제안합니다.

6
Ilmari Karonen

형식에 따라 다릅니다. 암호화 된 텍스트를 저장하기위한 일부 프로토콜에는 암호화 방식을 정의하는 일반 텍스트 부분이 있습니다. 귀하의 예에서, 참조하는 문자열이 너무 짧아서 암호화 된 텍스트 인 것처럼 보이기 때문에 의심 스럽습니다.

몇 가지 생각을 제안합니다.

  • 끝에 "=="는 확실히 패딩 될 것이므로 암호 해독 시도에 포함시키지 마십시오.

  • 암호화 대신 해시 또는 솔트 해시를 처리 할 수 ​​있습니다. 이 경우 데이터 "암호 해독"을 시도해도 작동하지 않습니다. 원래 사용 된 것과 동일한 해시 및/또는 솔트 값을 사용하여 비밀번호를 일치시켜야합니다. 소금에 절인 암호로 원래 값을 얻는 방법은 없습니다.

  • 가장 좋은 방법은 암호를 저장하는 데 사용되는 코드 사본을 얻는 것입니다. 어딘가에 암호가 암호화 작업 중입니다. 여기에서 무슨 일이 일어나고 있는지 배우는 코드를 찾으십시오. 10 중 9 번, 그들은 해싱/솔팅/암호화에 일종의 API를 사용하고 있으며 동일한 API를 사용하여 그것을 모방하거나 역전시킬 수 있습니다.

6
bethlakshmi

인코딩은 일반적으로 추측 할 수 있습니다. 예를 들어, 질문에 게시 한 문자열은 Base64로 인코딩됩니다. 등호는 Base64 체계에서 채워집니다. 그것은 내가 경험에서 알 수있는 것입니다.

암호화 된 문자열을 알려 주면 인코딩을 말할 수 있지만 메타 데이터를 사용할 수 없으면 암호화에 사용 된 알고리즘을 알려줄 수 없습니다. 그 이유는 다음과 같습니다. 암호화 알고리즘은 임의의 데이터로 보이는 것을 생성하여 작동합니다. 두 개의 암호 (4 개의 출력)로 각각 2 개의 문장을 암호화 한 경우 암호를 해독하거나 암호를 해독하지 않으면 어떤 암호 텍스트가 어떤 암호에 속하는지 확신 할 수 없습니다.

특정 인스턴스와 관련하여 비밀번호는 일반적으로 해시됩니다. 즉, 해시에서 비밀번호를 복구 할 수 없지만 해시가 비밀번호와 일치하는지 테스트 할 수 있습니다. 이와 관련하여 @ john 's answer 은 황금색입니다. 알고있는 암호를 입력 한 다음 일반적인 구성표를 시도하면 사용 된 해시가 무엇인지 알 수 있습니다.

6
Jeff Ferland

유일한 방법은 추측하는 것입니다. 경험이 있으면 추측 작업이 더 정확할 것입니다.

예를 들면 다음과 같습니다. 출력 길이 기준 : MD5 출력은 128 비트 또는 16 바이트, SHA1 출력은 160 비트 또는 20 바이트입니다. 출력 문자 세트를 기반으로 : BASE64는 인쇄 가능한 문자로 출력을 생성합니다.

하루가 끝날 무렵, 그것은 당신에게 방법을 가르치는 시도 오류 방식입니다.

4
Nam Nguyen

이것은 모든면에서 매우 약한 보안입니다! 평문은 P4 $$ w0rdP4 $$ w0rd이며 XOR 암호화를 사용하여 CdZ4MLMPgYtAE9gQ80gMtg == 키를 사용하여 암호화됩니다. 위 OP에 의해 게시 된 암호문, WeJcFMQ/8 + 8QJ/w0hHh + 0g ==.

확인하려면 :

먼저 xxd를 사용하여 평문의 기본 바이너리를 가져옵니다.

echo -n 'P4$$w0rdP4$$w0rd' | xxd -b -c16

이것은 다음을 생성합니다.

01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100

다음으로, 키를 base64로 디코딩하고 xxd를 사용하여 키의 기본 바이너리를 가져옵니다.

echo -n 'CdZ4MLMPgYtAE9gQ80gMtg==' | base64 -d | xxd -b -c16

이것은 다음을 생성합니다.

00001001 11010110 01111000 00110000 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110

이제 XOR 두 개의 이진 문자열 :

01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100  (plaintext)
[XOR]
00001001 11010110 01111000 00110000 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110  (key)
-----------------------------------------------------------------------------------------------------------------------------------------------
01011001 11100010 01011100 00010100 11000100 00111111 11110011 11101111 00010000 00100111 11111100 00110100 10000100 01111000 01111110 11010010  (ciphertext)

마지막으로 bc, xxd 및 base64를 사용하여 이진 암호문을 base64로 변환하십시오.

echo "obase=16; ibase=2; 01011001111000100101110000010100110001000011111111110011111011110001000000100111111111000011010010000100011110000111111011010010" | bc | xxd -p -r | base64

위의 질문에서 OP가 게시 한 암호문 인 WeJcFMQ/8 + 8QJ/w0hHh + 0g ==을 생성합니다.


이 답변이 고안된 것 같습니다 사과드립니다. 물론입니다. 포스터가 일부 암호문 만 제공하고 암호문이 어떻게 생성 될 수 있었는지에 대한 통찰력을 요구하는 이와 유사한 질문은 security.stackexchange.com에서 자주 나타납니다. 이 질문은 종종 그 질문과 중복되는 것으로 간주됩니다. 이 답변의 요점은 이러한 유형의 질문에 대한 무한한 해결책이 있기 때문에 이러한 성격의 질문에 답할 수 없음을 설명하는 것입니다.

1
mti2935

유일한 방법은 알려줄 메타 데이터가있을 때입니다. 예를 들어, 최근에 PDF로 작업 해 왔으며 형식에는 필터, 알고리즘, 키 크기 등이 포함 된 사전이 포함되어 있습니다. 그러나 암호문 만 있으면 불투명 한 얼룩이 있습니다. 데이터.

1
user185