it-swarm-vi.tech

Cho một tên người dùng linux và mật khẩu, làm thế nào tôi có thể kiểm tra nếu đó là một tài khoản hợp lệ?

Vì vậy, câu hỏi của tôi là chuyển thẳng đến tên người dùng linux và mật khẩu, làm thế nào tôi có thể kiểm tra nếu đó là một tài khoản hợp lệ?

16
smit

Bạn có thể xác nhận rằng mật khẩu đã cho là chính xác cho tên người dùng đã cho bằng tệp bóng.

Trên hầu hết các bản phân phối hiện đại, mật khẩu băm được lưu trữ trong tệp bóng/etc/bóng (chỉ có thể đọc được bằng root). Với quyền root, kéo dòng từ tệp bóng cho người dùng đã cho như vậy:

cat /etc/shadow | grep username

Bạn sẽ thấy một cái gì đó như thế này:

username:$1$TrOIigLp$PUHL00kS5UY3CMVaiC0/g0:15020:0:99999:7:::

Sau tên người dùng là $ 1. Điều này chỉ ra rằng đó là hàm băm MD5. Sau đó, có thêm $, sau đó (trong trường hợp này) TrOIigLp theo sau là $ khác. TrOIigLp là muối. Sau đó là mật khẩu băm, được băm bằng muối - trong trường hợp này là PUHL00kS5UY3CMVaiC0/g0.

Bây giờ, bạn có thể sử dụng openssl để băm mật khẩu đã cho bằng cách sử dụng cùng một loại muối, như vậy:

openssl passwd -1 -salt TrOIigLp

Nhập mật khẩu đã cho khi được nhắc, lệnh openssl sẽ tính toán hàm băm MD5 bằng cách sử dụng muối được cung cấp và nó phải giống hệt như ở trên từ tệp bóng. -1 trong lệnh trên là để băm MD5.

35
mti2935
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e)


passwordHash () {
    password=${1}
    salt=${2}
    encryption=${3}

    hashes=$(echo ${password} | openssl passwd -${encryption} -salt ${salt} -stdin)
    echo $(substring ${hashes} "$" "3")
}


passwordIsValid () {
    user=${1}
    password=${2}

    encryption=$(secret "encryption" ${user})
    salt=$(secret "salt" ${user})
    salted=$(secret "salted" ${user})
    hash=$(passwordHash ${password} ${salt} ${encryption})

    [ ${salted} = ${hash} ] && echo "true" || echo "false"
}


secret () {
    secret=${1}
    user=${2}
    shadow=$(shadow ${user})

    if [ ${secret} = "encryption" ]; then
        position=1
    Elif [ ${secret} = "salt" ]; then
        position=2
    Elif [ ${secret} = "salted" ]; then
        position=3
    fi

    echo $(substring ${shadow} "$" ${position})
}


shadow () {
    user=${1}
    shadow=$(cat /etc/shadow | grep ${user})
    shadow=$(substring ${shadow} ":" "1")
    echo ${shadow}
}


substring () {
    string=${1}
    separator=${2}
    position=${3}

    substring=${string//"${separator}"/$'\2'}
    IFS=$'\2' read -a substring <<< "${substring}"
    echo ${substring[${position}]}
}


passwordIsValid ${@}
1

Nếu bạn lo ngại về bảo mật (mà bạn nên có), câu trả lời được chấp nhận thể hiện rủi ro bảo mật bằng cách để lại mật khẩu văn bản gốc trong tệp ~/.bash_history. Với suy nghĩ này, sẽ tốt hơn nếu bạn thử đăng nhập hoặc có thể xóa mục nhập này khỏi ~/.bash_history.

0
Stringers