linux shadow文件密码hash原理

shadow文件结构

user:$6$X2w.CbqR$IH83vciPhgj.85yU33iS3m4fWf3gTGDxwg7EbUkt/XvhwZd/UAz9dxXzFzEx/dbpwG.cYCmm9yw8Lgp0:18731:0:99999:7:::
使用冒号分割,第一个字段是用户名,第二个字段是密码hash。
密码hash使用$分割为3部分,以此为例:

密码hash字段结构

$6$X2w.CbqR$IH83vciPhgj.85yU
$6 标识使用第6种加密模式,即SHA-512
$X2w.CbqR是加密盐值salt
$IH83vciPhgj.85yU…… 是密码hash。

密码hash的计算方法

计算方法为sha512(password,"$6$slat")

以下python程序保存后,可直接调用crypt算法执行加密。

python crypt.py --sha-512

在这里插入图片描述

#! /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()
    #salt="$6$salt"
    #password=" your password"
    print crypt.crypt(password, salt)

if __name__ == '__main__':
    main()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
密码原理与实践中的第四章主要介绍了哈希函数的相关知识。哈希函数是密码学中常用的一种算法,它能将任意长度的数据转换成固定长度的哈希值。在实践应用中,哈希函数主要用于数据完整性检验、数字签名、密码存储等方面。 首先,哈希函数具有固定长度的输出,不论输入的数据长短如何,都会得到相同长度的哈希值。这使得哈希函数可以用于验证数据的完整性。通过对比发送方计算得到的哈希值和接收方重新计算的哈希值是否一致,可以验证数据在传输过程中是否被篡改。 其次,哈希函数还可以被用于数字签名。发送方可以使用哈希函数计算出数据的哈希值,并使用自己的私钥对哈希值进行加密,生成数字签名。接收方可以使用发送方的公钥对数字签名进行解密,并计算收到的数据的哈希值。如果两个哈希值一致,就说明发送方确实是用私钥对数据进行加密的,数据的完整性和真实性得到了验证。 此外,哈希函数还可以用于密码存储。在用户注册或登录时,系统通常会要求用户设置一个密码。为了保护用户密码的安全,系统不会直接将用户密码存储在数据库中,而是使用哈希函数将密码转化为哈希值后存储。当用户登录时,系统会将用户输入的密码也转化为哈希值,并与数据库中存储的哈希值进行比对,从而判断密码是否正确。 总之,哈希函数在密码学中扮演着重要的角色,具有不可逆、固定长度、数据完整性验证、数字签名、密码存储等特性。了解和应用哈希函数是密码学学习中的重要一步。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值