21

文档向我们介绍了 github示例,但这有点稀疏和神秘。

它是这样说的:

# created with:
# crypt.crypt('This is my Password', '$1$SomeSalt')
password: $1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.

crypt.crypt不会发出示例显示的内容。它还使用 MD5。

我试过这个:

# python
import crypt
crypt.crypt('This is my Password', '$6$somereallyniceandbigrandomsalt$')
>> '$69LxCegsnIwI'

但是用户的密码字段应该是这样的:

password: $6$somereallyniceandbigrandomsalt$UqddPX3r4kH3UL5jq5/ZI.

其中包括三个分隔符$分隔符6(表示它是 SHA-512 哈希)、盐和加密密码。

请注意,python crypt 文档没有提到任何关于$N格式的内容。

问题:

  1. 提供给 的盐是crypt.crypt应该以尾随$结尾还是$N$SALT格式?

  2. Python 文档引用了 DES,但是如何调用 SHA-512 或 MD5,这方面的文档在哪里?

  3. 我真的应该输出crypt.crypt并切断前6 美元并制作$N$SALT$CRYPTED吗?这是ansible需要的吗?

4

8 回答 8

33

文档中显示的 python 示例取决于您使用的操作系统上运行的 crypt 版本。

我在 OS X 上生成了 crypt,我的目标服务器是 ubuntu。

由于操作系统提供的 crypt 实现的不同,结果是不同的和不兼容的。

改用这个:

http://pythonhosted.org/passlib/

Passlib 是 Python 2 和 3 的密码哈希库,它提供了 30 多种密码哈希算法的跨平台实现,以及管理现有密码哈希的框架。它被设计用于广泛的任务,从验证 /etc/shadow 中的哈希到为多用户应用程序提供全强度密码哈希。

>>> # import the hash algorithm
>>> from passlib.hash import sha512_crypt

>>> # generate new salt, and hash a password
>>> hash = sha512_crypt.encrypt("password")
>>> hash

'$6$rounds=656000$BthPsosdEpqOM7Qd$l/ln9nyEfxM67ea8Bvb79JoW50pGjf6iM87taIvfSmpjasE4/wBG1.60pFS6W992T7Q1q2wikMbxYUvMHD1tT1'

于 2013-08-01T10:56:39.253 回答
6

这已在Ansible 文档中更新。有两种首选方式:

如何为用户模块生成加密密码?

大多数 Linux 系统上可用的 mkpasswd 实用程序是一个不错的选择:

mkpasswd --method=SHA-512如果您的系统上未安装此实用程序(例如,您使用的是 OS X),那么您仍然可以使用 Python 轻松生成这些密码。首先,确保已安装 Passlib 密码哈希库。

pip install passlib

库准备就绪后,即可生成 SHA512 密码值,如下所示:

python -c "from passlib.hash import sha512_crypt; import getpass; print sha512_crypt.encrypt(getpass.getpass())"

于 2015-08-04T01:43:58.883 回答
4

这对我有用(使用 python 2.7.4):

python
>>> import crypt
>>> crypt.crypt('thisismypassword', '$6$Som3S@lt$')
'$6$Som3S@lt$XGoe9ONI00NaTkYn46CLDr8TSkvkovahinFqy95vrSe5Hzx2999C9mgF76ODFRnXMJHUCWFHLdkYd3c7AB9WV.'

我有一个看起来像这样的 vars.yml:

---
password: $6$Som3S@lt$XGoe9ONI00NaTkYn46CLDr8TSkvkovahinFqy95vrSe5Hzx2999C9mgF76ODFRnXMJHUCWFHLdkYd3c7AB9WV.

和这样的 playbook.yml :

---
- hosts: vagrant
  vars_files:
    - vars.yml
  user: vagrant

  tasks:
  - name: create artefactual user
    user: name=artefactual state=present password={{password}} shell=/bin/bash

我使用 vagrant, 运行我的剧本vagrant up,然后从另一个控制台我可以使用 ansible 创建的人工用户和密码 ssh 到新创建的虚拟机thisismypassword

我只是将 crypt.crypt 的输出复制到名为 password 的 ansible 变量中并使用它。您在问题中显示的 crypt 输出看起来太短了,我不确定您为什么会这样,也许是不同版本的 python?

于 2013-07-31T19:27:22.033 回答
3

您可以使用能够处理加密密码生成的 jinja2 过滤器。这是一个使用提供的密码创建 linux 用户的工作示例:

- name: Creating Linux User
  user:
    name: "{{ myuser }}" 
    password: "{{ mypassword | password_hash('sha512') }}"

希望这会对您和其他人有所帮助。

于 2015-05-26T00:59:04.200 回答
2

我接受了@felix 的回答并将其制作成一个脚本,我可以将其包含在我正在处理的 docker 项目中。我知道很多开发人员使用 macOS/OSX 并且该mkpasswd平台上没有,所以我将他们保存为谷歌搜索。

我添加了以下选项:

  • PROCESS_TIME (布尔值)
    • 启用带有轮数和 CPU 时间的第二行输出
  • ROUNDS (整数)
    • 覆盖default_rounds值,该值在“平均”系统上调整为大约 300 毫秒。您需要至少 100 毫秒,但应该尽可能长。
#!/usr/bin/env python3

# Because OSX doesn't have mkpasswd...

# Based on https://stackoverflow.com/a/17992126/117471
# python3 -c "from passlib.hash import sha512_crypt; print(sha512_crypt.encrypt(input()))" <<< bruno  # NOQA

# Usage:
#
# $ ./mkpasswd.py
# Password:
# $6$rounds=656000$pfFmQISGcjWHOCxW$rBptiSK.tqSPnUiq6KiSHzz6LvvW/x1SjkkWFwxWB9Dt75NLNBs0N3OyGV4K5ejjBs/u.o3jtigvUKbmmwVQP.
#
# $ PROCESS_TIME=1 ./mkpasswd.py
# Password:
# $6$rounds=656000$e0OGrad82DBrUo9T$ldqtOdN54gmXI6nb0D.Y5mm5ih.LIQm/Ep/bkNL76.3hE65FqXA9wyZ.M5YOrv6dSvwhPAktXGJ6LJT0Fgd4x.
# 656000 rounds in 1.008705 seconds of cpu time
#
# $ ROUNDS=1280000 PROCESS_TIME=1 ./mkpasswd.py <<< bruno
# $6$rounds=1280000$QO5FSyw5rQpiY6PI$0zRMJ4RzCbH61XxIdpsUm/79.VZ13Mm9TBN9GvJwt1LI1U5FVzakrLya5VJsXlTou3p5ZeWmo29bIUjubRuc31
# 1280000 rounds in 1.9206560000000001 seconds of cpu time

import os
import sys
import time
from getpass import getpass
from passlib.hash import sha512_crypt

rounds = os.environ.get('ROUNDS')
if not rounds:
    rounds = sha512_crypt.default_rounds

passwd = input() if not sys.stdin.isatty() else getpass()

proc = sha512_crypt.using(rounds=rounds)
start = time.process_time()
out = proc.encrypt(passwd)
end = time.process_time()

print(out)

if os.environ.get('PROCESS_TIME'):
    print('{} rounds in {} seconds of cpu time'.format(rounds, end-start))
于 2017-07-14T14:20:04.527 回答
1

我一直在使用以下 shell 命令来设置密码。

- name: "Set user password: someuser"
  command: 'echo "somepassword"| passwd --stdin "someuser"'
  sudo: yes
于 2014-08-15T18:55:12.790 回答
0

试试这样

vars_prompt:
 - name: "user_password"    
   prompt: "Enter a password for the user"    
   private: yes    
   encrypt: "md5_crypt" #need to have python-passlib installed in local machine before we can use it    
   confirm: yes    
   salt_size: 7

 - name: "add new user" user: name="{{user_name}}" comment="{{description_user}}" password="{{user_password}}" home="{{home_dir}}" shell="/bin/bash"
于 2014-04-09T15:14:11.500 回答
0

这需要pwgen安装在目标主机上:

- name: generate linux user password
  local_action: shell /usr/bin/pwgen 16 1
  register: generated_linux_user_password

如果您需要全局可用的“变量”,请使用 和 hostvars(事实在创建后是只读的hosts: localhost):set_fact

{{hostvars['localhost']["new_fact"]}}
于 2017-05-08T06:17:17.310 回答