2015-09-14 18 views
5

Sto migrando un codice c da Linux a Mac OSX (yosemite). La funzione crypt() di Mac OSX (che è in unistd.h, come ho determinato), non è la stessa di gcc/gnu in Linux. Ho programmi di test su Linux e Mac OSX e la funzione c-library crypt() visualizza una stringa di 34 caratteri, se si visualizza il risultato utilizzando printf. Lo stesso codice su Mac OSX, mostra solo una stringa di 13 caratteri. Un po 'di ricerca suggerisce che la differenza è che apparentemente la routine della libreria crypt() di Linux genera l'hash dai vettori più lunghi sul lato gnu/gcc Linux, usando forse un algoritmo di crittografia diverso. Alcune informazioni suggeriscono anche che la funzione crypt() di Apple Mac OSX c-library utilizza solo DES per crittografare la stringa originale più il sale. Voglio che il mio codice di prova produca gli stessi risultati, su piattaforme Linux e Mac OSX.Come ottenere la stessa funzione crypt (3) in Mac OS X come Linux gcc/gnu crypt (3)? Linux gcc crypt (3) ha MD5 e SHA512. Apple GCC crypt (3) * only * utilizza DES

Esiste una funzione crypt() corretta per Apple Mac OSX, isometrica alla versione gnu/gcc di Linux, forse in una libreria di crittografia open source?

Oppure c'è una funzione di crypt (3) gnu/gcc equivalente (3) disponibile per Apple Mac OSX da qualche parte negli strumenti di sviluppo di Mac OSX? (Sono molto nuovo su Mac OSX). Sto usando il compilatore clang, parte del materiale Xcode scaricato da Apple, corrente per Yosemite 10.10.5, e suppongo di non essere il primo a incontrare questa anomalia. Grazie per qualsiasi informazione.

Ah. solo una piccola modifica: La roba Apple MacOSX sta usando DES algo, da qui il risultato di 13 caratteri, quando ispeziona l'hash. Gnu/gcc usa MD5 algo, da cui l'hash risultante da 34 caratteri. Questo è spiegato qui: http://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/crypt.html#crypt La mia domanda raffinata quindi; c'è una funzione equivalente a crypt (3) per Mac OSX che usa MD5 (o SHA512) invece di DES?

(*** seconda modifica Nota:.?. Questo è sempre interessante DES è povero, ma MD5 può essere violata in Kali Linux, utilizzando "hashcat" raccomandazione è di andare a SHA512 apparentemente dettagli sulla prova accademica/verificare re MD5 cracking sono qui: https://uwnthesis.wordpress.com/2013/08/07/kali-how-to-crack-passwords-using-hashcat/ Ancora, la mia domanda rimane.È la funzione MD5 crypt (3) per Mac OSX da qualche parte? Thx.)

(Pls scusa il mio grado di ignoranza del protocollo Mac OS X LLVM/gcc basato crypt() fuction è bunked junk, hardwired a solo usa DES, un hash irrinunciabile provato, peggio di MD5. (Chiamalo con la stringa salt di $ 6 $, e otterrai un hash DES di 13 caratteri. Incredibile!) Ho scoperto numerosi metodi per creare correttamente gli hash delle password (ad esempio MD5 e SHA512) su Linux piattaforme (perl, python, ecc.) In genere usano la lib di "crypt" (la stessa che si usa usando l'opzione "-lcrypt" in gcc su Linux), o "passlib" per python. Ma il mio MacBook, appena aggiornato su Yosemite 10.10.5, non ha nemmeno "passlib"! (Il mio vecchio box Fedora esegue Python 2.5.1, l'attuale scatola CentOS esegue Python 2.6.6 Il piccolo Macbook cattivo indica Python 2.7.10, usando il comando "python --version". Ho trovato questo eccellente post sul sito "ServerFault" : https://serverfault.com/questions/330069/how-to-create-an-sha-512-hashed-password-for-shadow?newreg=df160746fbcd47878d600cbe76ec8b7f

Il primo pitone e gli script Perl lavorano su Linux, dal momento che stanno usando glibc crypt(), sto indovinando, ma nessun "passlib.hash" sembra esistere da nessuna parte, Linux o Mac OS X.

Come diavolo posso creare un hash di password decente su questo MacBook? Sono un Mac OS X noob, e dal momento che ho confermato che Apple sta usando hash password SHA512 nei suoi file .plist, sono sicuro che questa fuctionality ha di esistere da qualche parte su questo strano (ma delizioso) pezzo di hardware alieno.Nel caso in cui uno è curioso, è possibile inserire questo per vedere il vostro "ShadowHashData" su Yosemite, dalla linea di cmd nel terminale: (mi dispiace, ha dimenticato di riferimento per questo, ho trovato la ricerca ultima notte, veramente utile)

sudo defaults read /var/db/dslocal/nodes/Default/users/<yourusername>.plist ShadowHashData | tr -dc 0-9a-f | xxd -r -p | plutil -convert xml1 - -o - 

Quindi sembra che Darwin/Yosemite stia usando la crittografia ok. Ho letto alcuni documenti Apple su cose di criptaggio comune, ma ci sono poche informazioni su come modificare il tuo gcc per puntare effettivamente alla libreria che contiene questa roba critica. Quando deciderò come fare, pubblicherò la risposta qui.

+0

È possibile utilizzare direttamente il codice [glibc crypt] (https://sourceware.org/git/?p=glibc.git;a=tree;f=crypt;hb=HEAD) - è necessario fornire qualsiasi codice modificato sotto la LGPL, ma è tutto gratis. – Useless

+0

md5sum dovrebbe essere lo stesso su entrambi OSX e Linux – stark

+0

OSX è ancora disponibile con OpenSSL (anche se deprecato)? In tal caso, 'openssl passwd -1' genera un hash crypt compatibile con md5. – indiv

risposta

3

OS X non utilizza la sua funzione crypt per nulla. Lo ha per compatibilità con POSIX, che non definisce come funziona, e diverse piattaforme hanno costruito diverse soluzioni nel corso degli anni. Linux non è particolarmente "corretto", è solo un'altra soluzione specifica del fornitore. Di Apple spiega la loro motivazione per crypt a crypt (1):

Questa libreria (FreeSec 1.0) è stato sviluppato al di fuori degli Stati Uniti d'America come un sostituto sgombra per la libreria zione Stati Uniti solo libcrypt encryp-. I programmi collegati all'interfaccia crypt() possono essere esportati dagli Stati Uniti solo se utilizzano crypt() esclusivamente per scopi di autenticazione ed evitare l'uso delle altre interfacce del programmatore elencate sopra. È stata prestata particolare attenzione nella libreria in modo che i programmi che utilizzano solo l'interfaccia crypt() solo da non inseriscano gli altri componenti.

Se è necessaria l'hashing della password multipiattaforma, è necessario implementarlo con un algoritmo noto, che non fornisce crypt. In generale ciò significa che dovrai generare il tuo formato, perché non ce n'è davvero uno standard. Raccomando di usare PBKDF2 anziché SHA2 appena salato, poiché include lo stretching e la salatura. Craccare le deboli password SHA512 con John the Ripper è ancora molto veloce e facile. Con un buon allungamento, è possibile proteggere anche le password più deboli. (Dalla descrizione di Linux crypt sembra che stiano facendo qualcosa di simile a PKBDF2, possibilmente esattamente PBKDF2 senza nominarlo.) Algoritmi simili includono scrypt e bcrypt. Mi piace PBKDF2 perché è così onnipresente e raccomandato da NIST (anche se ci sono argomenti molto ragionevoli che bcrypt e scrypt sono più forti).

I pezzi di PKBDF2 non sono così complicati e ci sono alcune buone implementazioni dei pezzi necessari in C con licenze permissive. Vedi MGCryptor per un esempio che ha tutti i pezzi necessari in ANSI C semplice con una licenza MIT. Guarda in particolare a pkcs5_pbkdf2() che potrebbe essere esattamente quello che vuoi.

PBKDF2 è ampiamente disponibile su molte piattaforme e lingue. OS X lo fornisce tramite Common Crypto.

Naturalmente è possibile implementare la propria versione di Linux crypt utilizzando Common Crypto. Ma dovrai fare molta attenzione a non copiare alcun codice (L) GPL nel processo a meno che tu non intenda utilizzare una licenza compatibile. Personalmente, vorrei creare una soluzione basata su PBKDF2.