2016-04-11 2 views
7

से pgcrypto से बांधें मैं अजगर से कुछ pgcrypto फ़ंक्शंस को कॉल करना चाहता हूं। अर्थात् px_crypt। मुझे ऐसा लगता है कि लिंक करने के लिए सही ऑब्जेक्ट फ़ाइलों को समझना प्रतीत नहीं होता है।पाइथन

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

और जीसीसी आदेश और उत्पादन:

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 

त्रुटि है:

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

यह 'इंटरप्टपेंडिंग' के बारे में शिकायत कर रहा है, यह प्रतीक किस पुस्तकालय से संबंधित है? – fluter

+0

पोस्टग्रेज़। मैं इसे यहां देख सकता हूं: http://doxygen.postgresql.org/globals_8c_source.html#l00029 लेकिन मुझे नहीं पता कि इसे कैसे लिंक करें। – Oin

+2

दो प्रश्न, 1. यह px_crypt क्यों होना चाहिए? उदाहरण के लिए आप * libssl.so * का उपयोग नहीं कर सकते हैं। 2. क्या आप समझते हैं कि 'px_crypt' को postgresql द्वारा रनटाइम पर 'dlsym()' संभवतः लोड किया गया है और यह कि' इंटरप्टपेन्डिंग 'उदाहरण के लिए कॉलर में परिभाषित एक वैश्विक चर हो सकता है? –

उत्तर

0

अपनी टिप्पणी में से एक से मैं यह मिल गया ...

यहाँ मेरी कोड है

मैं पासवर्ड डेटाबेस हैशर उत्पन्न करने में सक्षम होने के लिए pgcrypto के व्यवहार को दोहराना चाहता हूं जो पहले से ही मेरे डेटाबेस में मेल खाता है।

आप पहले से ही ऐसा करने के लिए अजगर का उपयोग कर सकते हैं। मैं क्या एल्गोरिथ्म का उपयोग कर रहे पता नहीं, और न ही चाहिए मैं, यहाँ दो अलग अजगर का उपयोग कर Postgresql के pgcrypto के रूप में ठीक उसी हैश उत्पन्न करने के लिए

क्रिप्ट

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

तरीके हैं यहाँ करने के लिए अजगर है पासवर्ड की जांच ...

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

एमडी के लिए 5 आप इस प्रकार passlib के md5_crypt उपयोग कर सकते हैं ...

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

अजगर कुछ ऐसा दिखाई देगा ...

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

ब्लोफिश

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

अजगर कोड ...

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

धन्यवाद, लेकिन यह मूल रूप से पूछे गए प्रश्न का उत्तर नहीं है। मुझे यह सुनिश्चित करने की ज़रूरत है कि मैं सटीक उसी एल्गोरिदम का उपयोग कर रहा हूं जो कि pgcrypto का उपयोग कर रहे हैंश की गणना करने के लिए कर रहा है। और विभिन्न कार्यान्वयन * अलग * कर सकते हैं। उदाहरण देखें http://doxygen.postgresql.org/crypt-blowfish_8c_source.html – Oin

+0

के नीचे बग-संगतता टिप्पणी मैंने कुछ 'अतिरिक्त' उदाहरणों को शामिल करने के लिए उत्तर अपडेट किया। – Harry

+0

अभी भी pgcrypto को बाध्यकारी के बारे में कुछ भी नहीं कहता है। – Oin