Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ตรวจสอบ UNIX Password ด้วย Python (โมดูล crypt)

โมดูล crypt ใช้ตรวจสอบ Password แบบ UNIX ใช้ Hash Function แบบ One-way (Modified DES Algorithm)

import crypt


crypt.crypt(word, salt)

  • word: Password ที่ผู้ใช้กรอก
  • salt: Random String (2 ตัวอักษรขึ้นไป) ใช้ Perturb DES Algorithm 4096 วิธี
  • Salt ประกอบด้วย: A-Z, a-z, 0-9, /, .
  • คืนค่า: Hashed Password String

ตัวอย่าง: ตรวจสอบ Password จริงจาก /etc/shadow

import crypt
import getpass
import spwd  # Shadow Password Database

def check_password():
    username = input("Enter Username: ")
    
    # ดึง Hashed Password จาก Shadow Database
    try:
        hashed = spwd.getspnam(username).sp_pwdp
    except KeyError:
        print("User not found")
        return False
    
    if not hashed or hashed in ('*', '!', 'x'):
        print("Account locked or no password")
        return False
    
    # รับ Password จากผู้ใช้ (ไม่ Echo)
    plain = getpass.getpass()
    
    # Crypt ด้วย Salt เดียวกับใน Shadow
    return crypt.crypt(plain, hashed) == hashed

if __name__ == "__main__":
    if check_password():
        print("Password matched")
    else:
        print("Password does not match")

ผลลัพธ์ (ต้องรันด้วย sudo)

$ sudo python3 check_pass.py
Enter Username: unix_user
Password: 
Password matched

รูปแบบ Hash ที่รองรับ (Modern Systems)

PrefixAlgorithmคำอธิบาย
$1$MD5Legacy
$5$SHA-256Common
$6$SHA-512Default บน Linux ใหม่
$y$YescryptModern, Memory-hard

โมดูล crypt รองรับทุกแบบโดยอัตโนมัติจาก Salt


Best Practices

  • รันด้วย Root เพื่ออ่าน /etc/shadow
  • ใช้ getpass ป้องกัน Shoulder Surfing
  • ไม่ควรเก็บ Plaintext Password
  • Application ใหม่: ใช้ passlib หรือ bcrypt แทน (ปลอดภัยกว่า)

ตัวอย่าง: Hash Password ใหม่

import crypt

# สร้าง Salt สำหรับ SHA-512 ($6$)
salt = crypt.mksalt(crypt.METHOD_SHA512)
hashed = crypt.crypt("my_secure_password", salt)
print(hashed)
# $6$rounds=656000$saltstring$hashedvalue...