crypt.crypt one-liner与脚本

时间:2015-05-27 01:41:59

标签: python

我是python的新手,希望将以下一行内容扩展为一个简短的脚本,以生成SHA512哈希,我可以将其用作Linux影子密码。

python -c "import crypt,random,string; \
           print crypt.crypt(raw_input('clear-text password: '), '\$6\$' \
           + ''.join([random.choice(string.ascii_letters + string.digits) \
           for _ in range(16)]))"

它可以打印出散列,例如

$6$oGLGsdsZpbbjUobu$lxAbyUYV17B5JEgIjAghvL8osZrFUccXkQ.RPW0AE0xbyKdhA.0WE3UWiwVI/0O0lXcaQ3jmIEFXjp5a6JajX1

但当我只是简单地将其重新编写为

#!/usr/bin/python

import crypt
import random
import string

print crypt.crypt(raw_input('clear-text password: '), '\$6\$'   \
 + ''.join([random.choice(string.ascii_letters + string.digits) \
 for _ in range(16)]))

它打印出一些看起来不正确的哈希值。

./shadow.py
clear-text password: dir
\$c0UU5dohpjE

单线工作正常,但我想知道我做错了什么。

由于

2 个答案:

答案 0 :(得分:4)

第一个例子是你给出的代码的输出。再次运行它。

(我很好奇为什么在脚本文件示例中为我打印出“\ $”,但不是内联示例。)

编辑:盐的前两个字符 - 在本例中为反斜杠和美元符号 - 用作实际的盐。 The rest of the salt are used as the "alphabet" to use in displaying the hash

我认为你认为\$\6以某种方式在Python中评估$6。不。

我的问题的答案,关于它在脚本文件示例中打印出来的原因是\$\6计算出shell中的$6 ,然后Python才会看到它

嗯,我想知道你把它放在那里,shell会尝试将它解析为第六个参数。为什么不使用chr(36)

答案 1 :(得分:1)

当你运行单行时,不要忘记bash也在查看脚本。它需要\$并将它们转换为文字$。出于某种原因,这会阻塞crypt.crypt

我跑了

>>> crypt.crypt('any string', '\$6\$' + 'abc')
'\\$d5GL183q0Yo'

针对

>>> crypt.crypt('any string', '$6$' + 'abc')
'$6$abc$h7OB.KW3LchliR... (truncated)'

在python解释器中。

help(crypt.crypt)给了我一个线索:

  

crypt(word, salt) -> string

     

字通常是用户的密码。 salt是一个2个字符的字符串           这将用于选择DES的4096种变体之一。那些角色           在salt中必须是“。”,“/”或字母数字字符。返回           散列密码为字符串,由字符组成           与盐相同的字母表。

看起来您正在使用crypt.crypt的一些未记录的功能,允许您添加字符?