/etc/shadow中密码段的生成方式
why?
为什么要手动生成?
通常情况下,使用passwd命令即可以为用户设置密码,但是在某些情况下是需要先获得加密后的密码然后去操作的,比如,kickstart文件中的rootpw指令,ansible创建用户时提前指定密码等,这时候不得不手动生成合理的密码。
密码段格式
先说说shadow文件中第二列的格式,它是加密后的密码,它有些玄机,不同的特殊字符表示特殊的意义:
①.该列留空,即”::”,表示该用户没有密码。
②.该列为”!”,即”:!:”,表示该用户被锁,被锁将无法登陆,但是可能其他的登录方式是不受限制的,如ssh公钥认证的方式,su的方式。
③.该列为”“,即”::”,也表示该用户被锁,和”!”效果是一样的。
④.该列以”!”或”!!”开头,则也表示该用户被锁。
⑤.该列为”!!”,即”:!!:”,表示该用户从来没设置过密码。
⑥.如果格式为”$id$salt$hashed”,则表示该用户密码正常。其中$id$的id表示密码的加密算法,$1$表示使用MD5算法,$2a$表示使用Blowfish算法,”$2y$”是另一算法长度的Blowfish,”$5$”表示SHA-256算法,而”$6$”表示SHA-512算法,
目前基本上都使用sha-512算法的,但无论是md5还是sha-256都仍然支持。$salt$是加密时使用的salt,hashed才是真正的密码部分。
生成方法
MD5 哈希方法:
下文都以生成明文”123456”对应的加密密码为例。
要生成md5算法的密码,使用openssl即可。
openssl passwd -1 '123456'
openssl passwd -1 -salt 'abcdefg' '123456'
- 1
- 2
SHA-512 哈希方法:
在CentOS 6上,可以借助grub提供的密码生成工具grub-crypt生成。
grub-crypt其实是一个python脚本,交互式生成密码。以下是/sbin/grub-crypt文件的内容:
#! /usr/bin/python
'''Generate encrypted passwords for GRUB.'''
import crypt
import getopt
import getpass
import sys
def usage():
'''Output usage message to stderr and exit.'''
print >> sys.stderr, 'Usage: grub-crypt [OPTION]...'
print >> sys.stderr, 'Try `$progname --help\' for more information.'
sys.exit(1)
def gen_salt():
'''Generate a random salt.'''
ret = ''
with open('/dev/urandom', 'rb') as urandom:
while True:
byte = urandom.read(1)
if byte in ('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
'./0123456789'):
ret += byte
if len(ret) == 16:
break
return ret
def main():
'''Top level.'''
crypt_type = '$6$' # SHA-256
try:
opts, args = getopt.getopt(sys.argv[1:], 'hv',
('help', 'version', 'md5', 'sha-256',
'sha-512'))
except getopt.GetoptError, err:
print >> sys.stderr, str(err)
usage()
if args:
print >> sys.stderr, 'Unexpected argument `%s\'' % (args[0],)
usage()
for (opt, _) in opts:
if opt in ('-h', '--help'):
print (
'''Usage: grub-crypt [OPTION]...
Encrypt a password.
-h, --help Print this message and exit
-v, --version Print the version information and exit
--md5 Use MD5 to encrypt the password
--sha-256 Use SHA-256 to encrypt the password
--sha-512 Use SHA-512 to encrypt the password (default)
Report bugs to <bug-grub@gnu.org>.
EOF''')
sys.exit(0)
elif opt in ('-v', '--version'):
print 'grub-crypt (GNU GRUB 0.97)'
sys.exit(0)
elif opt == '--md5':
crypt_type = '$1$'
elif opt == '--sha-256':
crypt_type = '$5$'
elif opt == '--sha-512':
crypt_type = '$6$'
else:
assert False, 'Unhandled option'
password = getpass.getpass('Password: ')
password2 = getpass.getpass('Retype password: ')
if not password:
print >> sys.stderr, 'Empty password is not permitted.'
sys.exit(1)
if password != password2:
print >> sys.stderr, 'Sorry, passwords do not match.'
sys.exit(1)
salt = crypt_type + gen_salt()
print crypt.crypt(password, salt)
if __name__ == '__main__':
main()
CentOS 7上默认安装的是grub2,它不提供grub-crypt。因此参照grub-crypt内容,使用下面的python语句简单代替grub-crypt,这同样也是交互式的。
python -c 'import crypt,getpass;pw=getpass.getpass();print(crypt.crypt(pw) if (pw==getpass.getpass("Confirm: ")) else exit())'
如果不想交互式,再改成如下形式:
python -c 'import crypt,getpass;pw="123456";print(crypt.crypt(pw))'
接下来,按照你需要的方式去使用它即可。
/etc/shadow中密码段的生成方式的更多相关文章
- linux的PAM认证和shadow文件中密码的加密方式
它是一种统一的认证方案.PAM 让您能随时改变您的认证方法以及需求,并且不需要重新编译任何代码就封装了所有本地认证方法.具体见 PAM 网站. 对于 PAM 您只需要做: 对您的密码采用不同于 DES ...
- Linux中使用pwconv实现passwd中密码到shadow
1.功能说明:开启用户的投影密码. 2.语 法:pwconv 3.个人理解:就是将/etc/passwd里的密码用x代替,并将真实密码(当然是加密后的)转移到/etc/shadow里面. 4.补充说明 ...
- shadow文件中密码的加密方式
1) 查看shadow文件的内容 cat /etc/shadow 可以得到shadow文件的内容,限于篇幅,我们举例说明: root:$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF ...
- ora-01658 :无法为表空间USERS 中的段创建INITIAL区
"CREATE INDEX "IDX_TS_BONUS_Q_201209_DS" ON "TS_BONUS_Q_201209" ("DS&q ...
- oracle学习 四(持续更新中)无法为表空间 MAXDATA 中的段创建 INITIAL 区
解决建立表的时候出现的 ORA-01658: 无法为表空间 MAXDATA 中的段创建 INITIAL 区 出现这个问题是因为表空间的大小不足,可以给他扩容这样的话也会多出来一个数据文件.具体写法如下 ...
- ORA-01658: 无法为表空间 YJXT 中的段创建 INITIAL 区
oracle 用imp导入数据的时候报错:遇到ORACLE 错误1658: 无法为表空间 MAXDATA 中的段创建 INITIAL 区 解决办法:需要添加数据文件而不是新增表空间,代码如下: alt ...
- 在Linux中调试段错误(core dumped)
在Linux中调试段错误(core dumped) 在作比赛的时候经常遇到段错误, 但是一般都采用的是printf打印信息这种笨方法,而且定位bug比较慢,今天尝试利用gdb工具调试段错误. 段错误( ...
- bootargs中ip段各项解释
目标板:合众达的SEED-DVS6467开发板 内核版本:2.6.10 最近同事测试板卡nfs挂载PC的文件系统时出现点问题,PC上ifconfig中显示以太网为eth3,然而板卡启动参数列表相关信息 ...
- ora-01658: 无法为表空间*****中的段创建 INITIAL 区
ora-01658: 无法为表空间*****中的段创建 INITIAL 区 原因:表空间不足 增大表空间.如果表空间动态增长,则扩大表空间的最大值.
随机推荐
- mysql的定时任务
参考博客:https://blog.csdn.net/qq_26562641/article/details/53301407 查看event是否开启: show variables like '%s ...
- http-request详解
HTTP请求 请求数据格式 响应数据格式 request
- 深入浅出mybatis之与spring集成
目录 写在前面 详细配置 1.dataSource(数据源) 2.sqlSessionFactory(Session工厂) 3.Mapper(映射器) 4.TransactionManager(事务管 ...
- CSS样式选择
1:#a,b{…………}一个id叫a和一个标签是b的样式 2:#a b{…………}一个id叫a下面的一个标签是b的样式3:#a:b{…………}一个id叫a的伪类b的样式4:#a.b{…………}一个id ...
- 一个不错的Html5 DatePicker控件,主要支持手机端。
原地址不知道在哪了,下载地址 QQ群:616945527 Html5控件wen文件夹中DatePicker.rar
- eclipse竖向选择快捷键
eclipse的编辑器自带竖向选择功能,在mac上的开启和关闭方法都是command+option+a,在windows下则为alt+shift+a
- Webpack2学习记录-2
这篇在 webpack-demo 目前下新建一个 w2 目录,学习 webpack.config.js 及 与 npm scripts 的使用. 1.w2 下新建一个 webpack.config.j ...
- 大规模数据导入和导出(oracle)
请期待... http://www.cnblogs.com/xwdreamer/archive/2012/06/08/2541678.html Oracle sqlldr的用法 (这个最完整) htt ...
- iFrame跨域解决办法
按情境分1.不跨域时2.主域相同.子域不同时3.主域不同不跨域时访问iframe: contentWindow访问父级:parent访问顶级:top a.html <html xmlns=&qu ...
- cookie, session, token 是什么 以及相应的安全考量
Cookie cookie 最常见的是用来保存一些账号信息,比如下图里的 记住账号 就是记录到了cookie里面 cookie 更主要的是针对和server通信的,我们知道http 是无状态的,那如果 ...