从 python 绑定到 pgcrypto
Bind to pgcrypto from python
我想从 python 调用一些 pgcrypto 函数。即px_crypt。我似乎无法找到 link 的正确目标文件。
这是我的代码:
#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
从你的一条评论中我得到了这个...
I want to replicate pgcrypto's behavior in order to be able to generate password hashes that match the ones already in my database.
您已经可以使用 python 来执行此操作。我不知道你使用的是什么算法,我也不应该知道,这里有两种不同的方法使用 python 生成与 Postgresql 的 pgcrypto
完全相同的散列
地穴
=# select crypt('12345678', gen_salt('xdes')), md5('test');
crypt | md5
----------------------+----------------------------------
_J9..b8FIoskMdlHvKjk | 098f6bcd4621d373cade4e832627b4f6
这里是 Python 检查密码...
#!/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
对于 md5,您可以使用 passlib
的 md5_crypt,如下所示...
=# select crypt('12345678', gen_salt('md5')), md5('test');
crypt | md5
------------------------------------+----------------------------------
$UUVXoPbO$JMA7yhrKvaZcKqoFoi9jl. | 098f6bcd4621d373cade4e832627b4f6
Python 看起来像...
#!/usr/bin/env python
from passlib.hash import md5_crypt
def login():
hash_ = '$kOFl2EuX$QhhnPMAdx2/j2Tsk15nfQ0'
print(md5_crypt.verify("12345678", hash_))
if __name__ == '__main__':
login()
河豚
select crypt('12345678', gen_salt('bf')), md5('test');
crypt | md5
--------------------------------------------------------------+----------------------------------
a$HLZUXMgqFhi/sl1D697il.lN8OMQFBWR2VBuZ5nTCd59jvGLU9pQ2 | 098f6bcd4621d373cade4e832627b4f6
Python代码...
#!/usr/bin/env python
from passlib.hash import md5_crypt
from passlib.hash import bcrypt
def blowfish():
hash_ = 'a$HLZUXMgqFhi/sl1D697il.lN8OMQFBWR2VBuZ5nTCd59jvGLU9pQ2'
print(bcrypt.verify("12345678", hash_))
if __name__ == '__main__':
blowfish()
我想从 python 调用一些 pgcrypto 函数。即px_crypt。我似乎无法找到 link 的正确目标文件。
这是我的代码:
#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
从你的一条评论中我得到了这个...
I want to replicate pgcrypto's behavior in order to be able to generate password hashes that match the ones already in my database.
您已经可以使用 python 来执行此操作。我不知道你使用的是什么算法,我也不应该知道,这里有两种不同的方法使用 python 生成与 Postgresql 的 pgcrypto
完全相同的散列地穴
=# select crypt('12345678', gen_salt('xdes')), md5('test');
crypt | md5
----------------------+----------------------------------
_J9..b8FIoskMdlHvKjk | 098f6bcd4621d373cade4e832627b4f6
这里是 Python 检查密码...
#!/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
对于 md5,您可以使用 passlib
的 md5_crypt,如下所示...
=# select crypt('12345678', gen_salt('md5')), md5('test');
crypt | md5
------------------------------------+----------------------------------
$UUVXoPbO$JMA7yhrKvaZcKqoFoi9jl. | 098f6bcd4621d373cade4e832627b4f6
Python 看起来像...
#!/usr/bin/env python
from passlib.hash import md5_crypt
def login():
hash_ = '$kOFl2EuX$QhhnPMAdx2/j2Tsk15nfQ0'
print(md5_crypt.verify("12345678", hash_))
if __name__ == '__main__':
login()
河豚
select crypt('12345678', gen_salt('bf')), md5('test');
crypt | md5
--------------------------------------------------------------+----------------------------------
a$HLZUXMgqFhi/sl1D697il.lN8OMQFBWR2VBuZ5nTCd59jvGLU9pQ2 | 098f6bcd4621d373cade4e832627b4f6
Python代码...
#!/usr/bin/env python
from passlib.hash import md5_crypt
from passlib.hash import bcrypt
def blowfish():
hash_ = 'a$HLZUXMgqFhi/sl1D697il.lN8OMQFBWR2VBuZ5nTCd59jvGLU9pQ2'
print(bcrypt.verify("12345678", hash_))
if __name__ == '__main__':
blowfish()