2011-09-01 7 views
4

Firefox 암호 데이터베이스 (해당 파일은 프로필 폴더에 signons.sqlite)에서 암호를 추출하는 간단한 유틸리티를 작성하고 싶습니다.Firefox 암호 데이터베이스 암호 해독

나는 지금까지 해왔 던 작업 : sqlite를 사용하여 데이터베이스를 열고 암호화 된 사용자 이름, 암호화 된 암호 및 웹 사이트 주소 (모두 std::string)를 열었습니다.

남은 유일한 것은 사용자 이름과 암호 문자열을 해독하는 것입니다.

나는 다음 ( PK11Decryptplaintext에 일반 텍스트 암호를 저장한다고) 시도 :

PK11Decrypt가 호출
void Firefox_Importer::PK11Decrypt(string _cipheredBuffer, char **plaintext) { 
    // declarations needed 
    SECItem * request; 
    SECItem * reply; 
    unsigned int len = (unsigned int)_cipheredBuffer.length(); 
    const char* cipheredBuffer = (const char*)_cipheredBuffer.c_str(); 

    // generate request and reply SECItem; seems to work properly 
    reply = SECITEM_AllocItem(NULL, NULL, 0); 
    if (reply == NULL) cout << "Error allocating SECITEM." << endl; 
    request = NSSBase64_DecodeBuffer(NULL, NULL, cipheredBuffer, len); 
    if (request == NULL) cout << "Error decoding buffer." << endl; 

    // the following is not working 
    SECStatus tmp = PK11SDR_Decrypt(request, reply, NULL); 
    if(tmp != SECSuccess) cout << "Something went wrong during decrypting" << endl; 

    *plaintext = (char*)malloc(reply->len + 1); 
    strncpy(*plaintext, (const char*)reply->data, reply->len); 
    (*plaintext)[reply->len] = '\0'; 

    SECITEM_FreeItem(request, true); 
    SECITEM_FreeItem(reply, true); 
} 

, 그것은 PK11SDR_Decrypt에 대한 호출이 제대로 작동하지 않았 음을 나타내는 Something went wrong during decrypting를 인쇄합니다. 항상 SECFailure (-1에 해당)을 반환합니다.

아무도 힌트가 있거나 내가 잘못하고있는 것을 알고 있습니까?

답변

2

마스터 비밀번호가 설정되어 있지 않아도 PK11_Authenticate() (으) 로의 전화는 선택 사항이 아닐 수 있습니다 (예, NSS가 엉망입니다). 그래서 첫 번째 다음을 수행해야 할 수 있습니다 암호 프롬프트를 표시 할 필요가있는 경우에 나는 PK11_Authenticate()에 컨텍스트로 NULL을 통과

PK11SlotInfo *slot = PK11_GetInternalKeySlot(); 
if (!slot) cout << "Error getting internal slot" << endl; 

SECStatus tmp = PK11_Authenticate(slot, PR_TRUE, NULL); 
if (tmp != SECSuccess) cout << "Authentication error" << endl; 

참고, 문맥에만 필요합니다.

편집 : 신경 쓰지 않고 PK11SDR_Decrypt()이 두 가지 기능을 내부적으로 호출한다는 사실을 알았습니다. 결과적으로 SECFailure을 얻게되면 PK11_GetInternalKeySlot()이 실패하여 NSS가 제대로 초기화되지 않았 음을 나타낼 수 있습니다.

+0

힌트를 보내 주셔서 감사합니다. 실제로 나는 'NSS_Init'을 호출하는 것을 잊어 버린 어리석은 실수를했습니다. 고맙습니다. – phimuemue

+0

@AmitKhandelwal :이 코드는 NSS 라이브러리를 사용하고 있다고 가정하고 모든 운영 체제에서 작동합니다. 단순히 컴퓨터의 데이터베이스에 액세스하려면 superuser.com에서 새로운 질문을하는 것이 좋습니다. –

+0

마스터 비밀번호를 설정하면 어떨까요? 알려진 마스터 비밀번호와 함께 PK11SDR_Decrypt를 사용할 수 있습니까? –

2

Firefox는 opensource 소프트웨어입니다. 가장 최근의 소스 here을 찾을 수 있습니다. 암호를 해독 한 부분을 찾아 응용 프로그램에 복사하는 부분은 사용자가 직접 찾아야합니다. 행운을 빕니다.

+0

그건 원칙적으로 좋은 지적입니다. 그러나 http://mxr.mozilla.org/firefox/source/security/manager/ssl/src/nsSDR.cpp#179에이 작업을 시도했지만 운이 없었기 때문에 여기에서 요청했습니다. – phimuemue

+0

먼저 초기화해야 할 것입니다. 소스에서 어떻게하는지 읽어보십시오. 어렵지 않아야합니다. – Listing

+0

"암호를 해독하는 부분"은 [nsSecretDecoderRing] (http://hg.mozilla.org/mozilla-central/file/7d3d1c2c75f8/security/manager/ssl/src/nsSDR.cpp#l249)입니다. 언뜻보기에는 질문의 코드와 동일합니다. –