2016-04-11 15 views
7

pythonからいくつかのpgcrypto関数を呼びたいと思います。すなわちpx_crypt。私はそれがリンクする正しいオブジェクトファイルを把握しているように見えることはできません。ここでPythonからpgcryptoにバインドする

は私のコードです:

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

とgccコマンドと出力:

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

'InterruptPending'について、このシンボルはどのライブラリに属していますか? – fluter

+0

Postgres。私はそれをhttp://doxygen.postgresql.org/globals_8c_source.html#l00029で見つけることができますが、リンクする方法はわかりません。 – Oin

+2

2つの質問、1.それはなぜpx_cryptであるべきですか? * libssl.so *は使用できません。 2. 'px_crypt'は実行時に' dlsym() 'とpostgresqlによって読み込まれ、' InterruptPending'は例えば呼び出し側で定義されたグローバル変数でしょうか? –

答えて

0

...

私のデータベースに既にあるものと一致するパスワードハッシュを生成するために、pgcryptoの動作を複製したいと思います。

あなたは既にこれを行うためにpythonを使うことができます。私はここに、PythonのここでのPostgreSQLのpgcryptoのとまったく同じハッシュを生成するために

墓所

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

をのpythonを使用して、異なる2つの方法があり、私をあなたが使用しているもののアルゴリズムを知って、またすべきではありませんMD用のパスワードを確認...

#!/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あなたは

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

Pythonの

は、次のようになります...

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

Pythonコードをpasslibのmd5_cryptを使用することができます...

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

関連する問題