在 MacOS X 上使用 crypt 的 Python SHA512 加盐密码

Posted

技术标签:

【中文标题】在 MacOS X 上使用 crypt 的 Python SHA512 加盐密码【英文标题】:Python SHA512 salted passwords with crypt on MacOS X 【发布时间】:2016-02-21 00:57:31 【问题描述】:

我正在尝试生成加密的密码字符串,类似于 Linux 中的 /etc/shadow。由于某种原因,我得到的输出不同。有什么想法我错过了什么,一个比另一个长(不包括盐部分)?

#!/usr/bin/python
import crypt

alg = 6  # SHA512
salt = 'vb1tLY1qiY'
word = 'password'

insalt = '$$$'.format(alg, salt)

cryptWord = crypt.crypt(word, insalt)
print cryptWord

输出为:$6FMi11BJFsAc

如果我像这样在 Linux 中生成它:

mkpasswd --method=sha-512 --salt=vb1tLY1qiY password

输出为:$6$vb1tLY1qiY$WFHTa6CRShEuKg63vuPTYOVRK1oQiM6johIEs2JslF1904VhEdSXlHje74eB4uLXHrKNyZ4bPjSlWpZD6qIo71

【问题讨论】:

无法复制。我在 2.7.6 和 3.4.3 上运行了你的 python 脚本。两者都产生了与mkpasswd 相同的完整输出。 @tdelaney 在repl.it 上用Python 3 试试,你会从crypt.crypt('password', '$6$vb1tLY1qiY$') 得到简短的回答 @TessellatingHeckler 哇,你是对的。在我的桌面上工作正常。让我感到困惑。 @TessellatingHeckler python crypt doc 说 请注意,此模块的行为取决于运行系统中 crypt(3) 例程的实际实现。。也许这与它有关。 @munircontractor 这是其中的一部分,但在 repl.it 上,crypt.crypt('password', '$6') 也返回 '$6FMi11BJFsAc'。该实现仅将前两个字符作为盐并忽略其余字符。根据我系统上的文档,$id$salt 是一个 glibc 扩展。 【参考方案1】:

我能够使用 passlib。它不是作为 python 的一部分安装的(至少在 OS X 上),但是你可以通过 pip 安装它。

sudo easy_install pip
pip install passlib
python -c "from passlib.hash import sha512_crypt; import getpass,string,random; print sha512_crypt.using(salt=''.join([random.choice(string.ascii_letters + string.digits) for _ in range(16)]),rounds=5000).hash(getpass.getpass())"

https://gist.github.com/hbeatty/25db5847e7068335681db88248d0deaf

【讨论】:

我仍在寻找无需安装外部软件即可工作的解决方案。应该是可能的,因为 OSX 密码本身是 sha512 加密的。另外:如果您需要 sudo 在 Mac 上安装软件,这清楚表明您走错了路,应该尝试寻找替代方案。

以上是关于在 MacOS X 上使用 crypt 的 Python SHA512 加盐密码的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NODE.JS 上模拟 php crypt()

双层设备映射器 - 自定义 dm-crypt

让 tkinter 在带有 asdf 的 macos 上使用 python 3.x

anaconda macOS ImportError:无法导入名称'MappingProxyType'

在MacOS Sierra上安装Conda(10.x)

在 MacOS X 上使用 FileDialog 而不是 JFileChooser 用于文件和目录