2016-04-11 14 views
7

Vorrei chiamare alcune funzioni di pgcrypto da python. Vale a dire px_crypt. Non riesco a capire i file oggetto giusti per collegare sembra.Bind to pgcrypto da python

Ecco il mio codice:

#include <Python.h> 

#include "postgres.h" 

#include "pgcrypto/px-crypt.h" 


static PyObject* 
pgcrypt(PyObject* self, PyObject* args) 
{ 
    const char* key; 
    const char* setting; 

    if (!PyArg_ParseTuple(args, "ss", &key, &setting)) 
     return NULL; 

    return Py_BuildValue("s", px_crypt(key, setting, "", 0)); 
} 

static PyMethodDef PgCryptMethods[] = 
{ 
    {"pgcrypt", pgcrypt, METH_VARARGS, "Call pgcrypto's crypt"}, 
    {NULL, NULL, 0, NULL} 
}; 

PyMODINIT_FUNC 
initpypgcrypto(void) 
{ 
    (void) Py_InitModule("pypgcrypto", PgCryptMethods); 
} 

e comandi gcc e uscita:

x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -fPIC -I/home/ionut/github/postgres/contrib/ -I/usr/include/postgresql/9.4/server/ -I/usr/include/python2.7 -c pypgcrypto.c -o build/temp.linux-x86_64-2.7/pypgcrypto.o 
x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wl,-z,relro -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security build/temp.linux-x86_64-2.7/pypgcrypto.o /usr/lib/postgresql/9.4/lib/pgcrypto.so -lpgport -lpq -o build/lib.linux-x86_64-2.7/pypgcrypto.so 

errore è:

python -c "import pypgcrypto; print pypgcrypto.pgcrypt('foo', 'bar')" 

Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
ImportError: /usr/lib/postgresql/9.4/lib/pgcrypto.so: undefined symbol: InterruptPending 
+0

Si lamenta di 'InterruptPending', a quale libreria appartiene questo simbolo? – fluter

+0

Postgres. Posso trovarlo su: http://doxygen.postgresql.org/globals_8c_source.html#l00029 ma non so come collegarlo. – Oin

+2

Due domande, 1. Perché dovrebbe essere px_crypt? Non puoi usare * libssl.so * per esempio. 2. Capisci che 'px_crypt' è caricato in fase di esecuzione da postgresql con' dlsym() 'probabilmente e che' InterruptPending' potrebbe essere ad esempio una variabile globale definita nel chiamante? –

risposta

0

da uno dei vostri commenti ho ottenuto questo ...

Voglio replicare il comportamento di pgcrypto per poter generare hash di password che corrispondano a quelli già presenti nel mio database.

È possibile utilizzare Python per farlo già. Non so che cosa l'algoritmo che si sta utilizzando, non dovrei, qui ci sono due metodi diversi utilizzando python per generare la stessa hash come pgcrypto di PostgreSQL

Cripta

=# select crypt('12345678', gen_salt('xdes')), md5('test'); 
     crypt   |    md5     
----------------------+---------------------------------- 
_J9..b8FIoskMdlHvKjk | 098f6bcd4621d373cade4e832627b4f6 

Ecco il Python per verificare la password ...

#!/usr/bin/env python 
import crypt 
from hmac import compare_digest as compare_hash 

def login(): 
    hash_ = '_J9..OtC82a6snTAAqWg' 
    print(compare_hash(crypt.crypt('123456789', hash_), hash_)) 
    #return True 

if __name__ == '__main__': 
    login() 

MD5

Per md 5 è possibile utilizzare md5_crypt passlib s' come segue ...

=# select crypt('12345678', gen_salt('md5')), md5('test'); 
       crypt    |    md5     
------------------------------------+---------------------------------- 
$1$UUVXoPbO$JMA7yhrKvaZcKqoFoi9jl. | 098f6bcd4621d373cade4e832627b4f6 

Python sarebbe un aspetto simile a ...

#!/usr/bin/env python 
from passlib.hash import md5_crypt 

def login(): 
    hash_ = '$1$kOFl2EuX$QhhnPMAdx2/j2Tsk15nfQ0' 
    print(md5_crypt.verify("12345678", hash_)) 

if __name__ == '__main__': 
    login() 

Blowfish

select crypt('12345678', gen_salt('bf')), md5('test'); 
          crypt        |    md5     
--------------------------------------------------------------+---------------------------------- 
$2a$06$HLZUXMgqFhi/sl1D697il.lN8OMQFBWR2VBuZ5nTCd59jvGLU9pQ2 | 098f6bcd4621d373cade4e832627b4f6 

codice Python ...

#!/usr/bin/env python 
from passlib.hash import md5_crypt 
from passlib.hash import bcrypt 

def blowfish(): 
    hash_ = '$2a$06$HLZUXMgqFhi/sl1D697il.lN8OMQFBWR2VBuZ5nTCd59jvGLU9pQ2' 
    print(bcrypt.verify("12345678", hash_)) 

if __name__ == '__main__': 
    blowfish() 
+0

Grazie, ma questa non è una risposta alla domanda che avevo originariamente chiesto. Devo essere sicuro di utilizzare lo stesso algoritmo per calcolare gli hash utilizzati da pgcrypto. E diverse implementazioni * possono * differire. Vedi per es. il commento sulla compatibilità dei bug nella parte inferiore di http://doxygen.postgresql.org/crypt-blowfish_8c_source.html – Oin

+0

Ho aggiornato la risposta per includere alcuni esempi "extra". – Harry

+0

Ancora non dice nulla sull'associazione a pgcrypto. – Oin