2026. szeptember 19., szombat

Fernet szimmetrikus titkosítás

Íme egy jelszóból kulcsot származtató, majd Fernet szimmetrikus titkosítást használó Python-program
-------
# Source - https://stackoverflow.com/a/73551491
# Posted by chuckx
# Retrieved 2026-09-19, License - CC BY-SA 4.0

#!/usr/bin/python

import base64
import secrets
from cryptography.fernet import Fernet
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

KDF_ALGORITHM = hashes.SHA256()
KDF_LENGTH = 32
KDF_ITERATIONS = 120000

def encrypt(plaintext: str, password: str) -> (bytes, bytes):
    # Derive a symmetric key using the passsword and a fresh random salt.
    salt = secrets.token_bytes(16)
    kdf = PBKDF2HMAC(
        algorithm=KDF_ALGORITHM, length=KDF_LENGTH, salt=salt,
        iterations=KDF_ITERATIONS)
    key = kdf.derive(password.encode("utf-8"))

    # Encrypt the message.
    f = Fernet(base64.urlsafe_b64encode(key))
    ciphertext = f.encrypt(plaintext.encode("utf-8"))

    return ciphertext, salt

def decrypt(ciphertext: bytes, password: str, salt: bytes) -> str:
    # Derive the symmetric key using the password and provided salt.
    kdf = PBKDF2HMAC(
        algorithm=KDF_ALGORITHM, length=KDF_LENGTH, salt=salt,
        iterations=KDF_ITERATIONS)
    key = kdf.derive(password.encode("utf-8"))

    # Decrypt the message
    f = Fernet(base64.urlsafe_b64encode(key))
    plaintext = f.decrypt(ciphertext)

    return plaintext.decode("utf-8")

def main():
    password = "aStrongPassword"
    message = "a secret message"

    encrypted, salt = encrypt(message, password)
    decrypted = decrypt(encrypted, password, salt)

    print(f"message: {message}")
    print(f"encrypted: {encrypted}")
    print(f"decrypted: {decrypted}")

-----------
Fiók jelszó módositása
--------------------
import subprocess
import getpass
import os
import sys


PSPASSWD = r"C:\Sysinternals\PsPasswd.exe"


def change_password(username):
    if not os.path.isfile(PSPASSWD):
        print(f"Hiba: nem található:\n{PSPASSWD}")
        return False

    new_password = getpass.getpass(
        f"Új jelszó a(z) {username} felhasználóhoz: "
    )

    confirm_password = getpass.getpass(
        "Új jelszó ismét: "
    )

    if new_password != confirm_password:
        print("A két jelszó nem egyezik.")
        return False

    if not new_password:
        print("Üres jelszó használata nem engedélyezett.")
        return False

    command = [
        PSPASSWD,
        username,
        new_password
    ]

    try:
        result = subprocess.run(
            command,
            capture_output=True,
            text=True
        )

        print("Kimenet:")
        print(result.stdout)

        if result.stderr:
            print("Hiba:")
            print(result.stderr)

        if result.returncode == 0:
            print("A jelszó módosítása sikeres.")
            return True

        print(
            f"PsPasswd hibakód: {result.returncode}"
        )
        return False

    except Exception as e:
        print(f"Programhiba: {e}")
        return False


if __name__ == "__main__":

    print("=== PsPasswd Python vezérlő ===")
    print()

    username = input(
        "Melyik helyi Windows-fiók jelszavát módosítsuk? "
    ).strip()

    if not username:
        print("Nem adtál meg felhasználónevet.")
        sys.exit(1)

    change_password(username)
-------------------
Visszafejtés
-------------
decrypted = decrypt(encrypted, password, salt)
--------

A program újra előállítja a kulcsot:

password + salt
       ↓
 PBKDF2-HMAC-SHA256
       ↓
 ugyanaz a kulcs
       ↓
 Fernet.decrypt()
       ↓
 eredeti szöveg
-------------
message: a secret message
encrypted: b'gAAAAA...'
decrypted: a secret message
-------------
Ha PBKDF2 + Fernet alapú, jelszóvezérelt szimmetrikus titkosítási algoritmust átírjuk;
import getpass

password = getpass.getpass("Jelszó: ")
akkor nem jelenik mega monitoron!

Nincsenek megjegyzések:

Megjegyzés küldése