zoukankan      html  css  js  c++  java
  • linux的shadow文件

    在《Python绝技》这本书的第一个小程序首先展示了针对与unix系统中shadow文件密码的暴力破解的能力,因为之前只是对shadow文件停留在保存了用户密码的阶段,但并没有详细研究,所以周末两天特地花时间好好研究了一下。 
    1.passwd文件和shadow文件 
    在unix早些时候是没有/etc/shadow这个文件的。一个用户的所有信息都只是保存在/etc/passwd文件中,加密后的用户密码保存在了passwd文件的第二个字段中。那么为什么要产生shadow文件呢? 
    首先我们通过ls查看一下passwd文件的详细权限: 
    -rw-r--r-- 1 root root 1505 Mar 6 22:34 /etc/passwd 
    可以看出每个用户都是可读的,那么这不就把用户密码暴露给任何人了么?虽然是加过密的,但是这样也存在安全性问题。 
    现在的文件权限是这样的:(注意/usr/bin/passwd除了rwx权限外还有一个SetUID的s标识位) 
    -rwsr-xr-x. 1 root root 30768 Feb 22 2012 /usr/bin/passwd 
    ---------- 1 root root 964 Mar 6 22:34 /etc/shadow 
    首先通过对shadow文件取消所有权限,保证了只有root才能对shadow文件进行读写(root是天神,没有特殊说明任何文件都在root的管辖之下)。那么普通用户修改密码时肯定要对shadow文件进行更改的啊?通过/usr/bin/passwd的s位实现。 
    普通用户的修改密码流程是这样的: 
    test用户调用/usr/bin/passwd命令修改自己的密码,因为passwd对任何用户都是可执行的,而且s位规定所有可执行的用户在执行这个命令时变身为root,所以此时test用户拿着root的权限去读写shadow文件,当命令执行完成后变身结束,test变失去root权限。可以看出经过对shadow文件的分离,既保证了普通用户对自己密码的修改,也保证了普通用户看不到加密后的密码串提升了安全性。 
    2.shadow文件的组成 
    root:$1$abcdefg$Qp6zr7K0tHxV79N9cCLSc1:16866:0:99999:7::: 
    帐号名称 :root 
    加密后的密码:$1$abcdefg$Qp6zr7K0tHxV79N9cCLSc1 
    上次修改密码的日期:16866 
    密码不可被变更的天数:0 
    密码需要被重新变更的天数:99999(99999表示不需要变更) 
    密码变更前提前几天警告 :7 
    帐号失效日期 :无 
    帐号取消日期 :无 
    保留条目,目前没用 
    3.shadow文件的密码部分 
    shadow文件的密码部分由三个部分组成,由'$'分割。 
    以上面root用户的密码为例,按照'$'分割后分别是加密方式(1),salt值(abcdefg),加密后的密码串(Qp6zr7K0tHxV79N9cCLSc1)。 
    首先看第一个加密方式,目前加密方式有6种,最常见的只有3种: 
    1:MD5加密,密文长度22 
    5:SHA-256加密,密文长度43 
    6:SHA-512加密,密文长度86 
    4.手动生成password字串(测试于centos6.5) 
    方法一:dovecot包中提供dovecotadm命令。 
    比如:doveadm pw -s SHA512-CRYPT,其中s参数可选多种加密方式,比如SHA512-CRYPT,SHA256-CRYPT,MD5-CRYPT。 
    方法二:openssl包中提供passwd子命令。 
    比如openssl passwd -1,但是我发现只支持md5。 
    方法三:默认的python中自带crypt库。

    __import__("crypt").crypt("password","$1$abcdefg$") 
    • 1

    如果你不想自己设置指定的salt值,可以使用crypt库的mksalt函数自动生成,且提供md5,sha256,sha512全方位的支持。

  • 相关阅读:
    LeetCode 24. Swap Nodes in Pairs (两两交换链表中的节点)
    LeetCode 1041. Robot Bounded In Circle (困于环中的机器人)
    LeetCode 1037. Valid Boomerang (有效的回旋镖)
    LeetCode 1108. Defanging an IP Address (IP 地址无效化)
    LeetCode 704. Binary Search (二分查找)
    LeetCode 744. Find Smallest Letter Greater Than Target (寻找比目标字母大的最小字母)
    LeetCode 852. Peak Index in a Mountain Array (山脉数组的峰顶索引)
    LeetCode 817. Linked List Components (链表组件)
    LeetCode 1019. Next Greater Node In Linked List (链表中的下一个更大节点)
    29. Divide Two Integers
  • 原文地址:https://www.cnblogs.com/beautiful-code/p/9444201.html
Copyright © 2011-2022 走看看