我是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
单线工作正常,但我想知道我做错了什么。
由于
答案 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
的一些未记录的功能,允许您添加字符?