โมดูล 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)
| Prefix | Algorithm | คำอธิบาย |
|---|---|---|
$1$ | MD5 | Legacy |
$5$ | SHA-256 | Common |
$6$ | SHA-512 | Default บน Linux ใหม่ |
$y$ | Yescrypt | Modern, 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...