2016-04-11 11 views
7

Bazı pgcrypto işlevlerini python'dan aramak istiyorum. Yani px_crypt. Göründüğü bağlantı için doğru nesne dosyalarını anlayamıyorum.python'dan pgcrypto'ya bağlama

#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); 
} 

ve gcc komutları ve çıkış:

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 

Hata geçerli:

bu var yorumlarınızı birinden
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

Bu simge hangi kütüphaneye ait? InterruptPending' hakkında şikayet ediyor? – fluter

+0

Postgres. Bunu şu adreste bulabilirim: http://doxygen.postgresql.org/globals_8c_source.html#l00029 ancak nasıl bağlayacağımı bilmiyorum. – Oin

+2

İki soru, 1. Neden px_crypt olmalı? Örneğin * libssl.so * kullanamazsınız. 2. 'px_crypt'un çalışma zamanında postgresql ile 'dlsym()' arasında yüklendiğini ve' InterruptPending 'örneğinin arayanda tanımlanmış bir global değişken olabileceğini biliyor musunuz? –

cevap

0

...

İşte

kod bu

Veritabanımdakilerle eşleşen şifre karmalarını oluşturabilmek için pgcrypto'nun davranışını çoğaltmak istiyorum.

Bunu yapmak için python'u kullanabilirsiniz. Ben İşte için Python var burada PostgreSQL en pgcrypto tamamen aynı hash oluşturmak

Crypt

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

piton kullanarak iki farklı yöntem vardır, I kullandığınız hangi algoritma biliyor nede yok md için

#!/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

... şifreyi kontrol aşağıdaki gibi 5 Eğer

#!/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('md5')), md5('test'); crypt | md5 ------------------------------------+---------------------------------- $1$UUVXoPbO$JMA7yhrKvaZcKqoFoi9jl. | 098f6bcd4621d373cade4e832627b4f6 

Python

benzer görünümde olacaktır ...

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

Python kodunu passlib 'ın md5_crypt kullanabilirsiniz ...

#!/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

Teşekkürler, ama bu aslında sorduğum soruya bir cevap değil. Pgcrypto'nun kullandığı karmaları hesaplamak için tam olarak aynı algoritmayı kullandığımdan emin olmalıyım. Ve farklı uygulamalar * farklı olabilir *. Bakınız örn. http://doxygen.postgresql.org/crypt-blowfish_8c_source.html – Oin

+0

'un altındaki hata-uyumluluk yorumu yanıtını bazı 'ekstra' örnekler içerecek şekilde güncelledim. – Harry

+0

Hala pgcrypto'ya bağlanma hakkında bir şey söylemiyor. – Oin