在 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 加盐密码的主要内容,如果未能解决你的问题,请参考以下文章
让 tkinter 在带有 asdf 的 macos 上使用 python 3.x