在Win 7 64位Python上安装py-bcrypt

6

尝试在Win7上安装py-bcrypt。Python是64位的。首先报错找不到vcvarsall.bat。经过一番搜索,得知需要安装mingw。现在已经安装好了:

C:\tools\python_modules\py-bcrypt-0.2>python setup.py build -c mingw32
running build
running build_py
running build_ext
building 'bcrypt._bcrypt' extension
C:\MinGW\bin\gcc.exe -mno-cygwin -mdll -O -Wall -Ic:\Python27\include -Ic:\Python27\PC -c bcrypt/bcrypt_python.c -o b
d\temp.win-amd64-2.7\Release\bcrypt\bcrypt_python.o
bcrypt/bcrypt_python.c:29:26: error: expected declaration specifiers or '...' before 'u_int8_t'
bcrypt/bcrypt_python.c:29:38: error: expected declaration specifiers or '...' before 'u_int16_t'
bcrypt/bcrypt_python.c:29:49: error: expected declaration specifiers or '...' before 'u_int8_t'
bcrypt/bcrypt_python.c: In function 'bcrypt_encode_salt':
bcrypt/bcrypt_python.c:56:2: error: too many arguments to function 'encode_salt'
bcrypt/bcrypt_python.c:29:6: note: declared here
error: command 'gcc' failed with exit status 1

不知道接下来该怎么做。我猜我会放弃使用bcrypt并尝试其他方法。还有其他建议吗?

7个回答

7

这个会很快有0.4版本吗? - Joe
1
@Joe,我刚刚添加了0.4的轮子。 - alexandrul
@alexandrul 太棒了!谢谢你! - Joe
找不到 .exes 文件? - Rob Grant

3

在我尝试通过pip在Windows 7上使用VS2012安装py-bcrypt时,偶然间发现了这个相当古老的帖子。显然,这仍然行不通(我也遇到了“缺少vcvars.bat”错误)。

有一个专门为Windows设计的py-bcrypt分支,称为py-bcrypt-w32,我可以轻松安装它,而没有任何问题。

pip install py-bcrypt-w32

在我看来,这应该是被接受的答案。对于在Windows上进行开发的情况,只需使用py-bcrypt-w32而不是py-bcrypt,并为每个环境使用两个不同的requirements.txt文件。 - Chockomonkey

3
我已经查看了bcrypt的源代码,但是无法弄清楚为什么你会遇到错误(目前手头没有Windows系统进行测试)。不过,根据查看pybcrypt 问题跟踪器,似乎它还存在其他Windows编译问题,因此这可能并不只是你一个人的问题。猜测一下,通过extra_compile_args将"--std=C99"添加到gcc参数中可能会修复至少一些错误。
除此之外,还有几个替代方案-
  • Bcryptor是另一个C扩展的bcrypt实现,可以编译适合您的系统。

  • Passlib是一个通用的密码哈希库。虽然它依赖于bcryptor/pybcrypt来支持bcrypt,但它内置了对许多其他密码哈希的支持,这些哈希可能适合您——例如SHA512-CryptPBKDF2-HMAC-SHA512

  • Cryptacular是另一个通用的密码哈希库。在Windows上,它提供了BCrypt和PBKDF2-HMAC-SHA512密码哈希。(我想直接链接到它们,但文档不太允许我这样做)


我猜Windows可能不适合这个:) 我可能会继续使用简单的hashlib.sha512,就这样吧。bcryptor出现了更多错误。我会尝试下一个cryptacular,就这样。 - pocorschi
ok cryptacular 工作正常。它是 bcrypt 的工作方式。问题是,我不应该给 bcrypt 加盐吗?只是问一下。 - pocorschi
如果您正在遵循 Cryptacular 文档顶部的示例,则 manager.encode(password) 将处理盐生成... 您可以通过两次运行 manager.encode("test") 进行测试,将看到哈希值不同 - 这表明它正在生成新的盐。 (此页面 简要描述了 bcrypt 哈希字符串格式,如果您感兴趣的话可以查看)。 - Eli Collins
好的,等一下。那么我不需要单独存储盐吗?轮数和盐都存储在哈希内部了吗? - pocorschi
1
是的...实际上,我链接的所有密码哈希都是完全自包含的,代码会自动处理盐生成。对于Cryptacular,调用.encode() / 对于Passlib,调用.encrypt()就可以完成所有操作...然后只需调用.verify()来检查密码。如果您想要不同于默认值的轮数,只需在调用encode()时将其作为rounds=value传递即可。 - Eli Collins

2
我曾经遇到同样的问题,通过应用此链接中找到的补丁解决了它:http://code.google.com/p/py-bcrypt/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Summary&groupby=&sort=&id=1。需要手动应用py-bcrypt_11.patch。从那个线程中可以看出,问题的根源在于:

根据http://groups.google.com/group/mpir-devel/msg/2c2d4cc7ec12adbb(在各种Windows操作系统、cygwins、mingw和其他操作系统下定义的标志)的说法,最好使用_WIN32而不是_MSC_VER。再加上从bzero到memset的更改,这将编译MSVC和MingW32。

希望能对你有所帮助!

0

我曾经遇到过与Python 3.4.1相同的问题,之前的答案都没有起作用。最终我让Visual Studio 2010 64位编译器工作,并通过easy_install安装了cryptacular和py-bcrypt。请参见我的详细答案:https://dev59.com/sHE85IYBdhLWcg3wXCIv#27033824


0

0

假设您正在使用mingw64,您应该将bcrypt.c、bcrypt_python.c和pybc_blf.h中的#ifdef中的_MSC_VER更改为_WIN32


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接