> ## Documentation Index
> Fetch the complete documentation index at: https://support.locker.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Thuật toán khởi tạo khóa PBKDF2

> Giới thiệu về thuật toán PBKDF2 SHA-256 và cách Locker sử dụng để khởi tạo Khóa mã hóa từ Mật khẩu chính

## Thuật toán khởi tạo khóa PBKDF2

Thuật toán PBKDF2 (Password-based Key Derivation Function 2) SHA-256 được sử dụng để khởi tạo Khóa mã hóa từ [Mật khẩu chính](/vi/locker-whitepaper/security-fundamentals/master-password) của người dùng. Mật khẩu chính sẽ được mã hóa, bằng một giá trị ngẫu nhiên là địa chỉ email của người dùng và kỹ thuật băm, một cách cục bộ trên máy của người dùng, trước khi gửi đến máy chủ Locker. Khi máy chủ Locker nhận được Mật khẩu chính đã mã hóa, mật khẩu đó sẽ được mã hóa một lần nữa với một giá trị ngẫu nhiên an toàn (khởi tạo từ [Thuật toán sinh số ngẫu nhiên CSPRNG](/vi/locker-whitepaper/security-fundamentals/cryptographically-secure-pseudorandom-number-generator)), cùng với kỹ thuật băm, và sau đó được lưu trữ trong cơ sở dữ liệu của Locker.

Số lần lặp mặc định được sử dụng với thuật toán PBKDF2 là **100.001** lần lặp trên máy người dùng, và sau đó là **216.000** lần lặp bổ sung khi được lưu trữ trên máy chủ của Locker (với tổng số **316.001** lần lặp theo mặc định).

<img src="https://mintcdn.com/locker/ZpQHj9IjHy-TnRFC/images/vi/locker-whitepaper/security-fundamentals/PBKDF2.png?fit=max&auto=format&n=ZpQHj9IjHy-TnRFC&q=85&s=bddcb5e507f82db493c0300a4a122e4a" alt="PBKDF2" width="1190" height="1430" data-path="images/vi/locker-whitepaper/security-fundamentals/PBKDF2.png" />

Thuật toán PBKDF2 có 5 tham số đầu vào:

$$
key = PBKDF2(password, salt, iter\_count, hash\_func, key\_len)
$$

Trong đó:

* `password`: mật khẩu chính của người dùng.
* `salt`: cryptographic salt, ở đây Locker sử dụng email người dùng làm salt đầu tiên.
* `iter_count`: số vòng lặp.
* `hash_func`: thuật toán băm với đầu ra dài $h_{len}$.
* `key_len`: độ dài mong muốn của key.

Khóa `K` sẽ được chia làm các khối dài tối đa $h_{len}$. Với mỗi khối $KH_i$:

1. Sử dụng [hàm băm](/vi/locker-whitepaper/security-fundamentals/hash-function) `iter_count` lần với đầu vào là `password` và `salt`, với `salt` đầu tiên là email người dùng, các `salt` sau là đầu ra của lần băm trước:

$$
H_1 = hash\_func(password, email)
$$

$$
H_2 = hash\_func(password, H_1)
$$

$$
\vdots
$$

$$
H_(iter\_count) = hash\_func(password, H(iter\_count-1))
$$

2. Thực hiện phép XOR với tất cả các đầu ra $Hi$ từ bước 1:

$$
KH_i = H_1 \oplus H_2 \oplus \dots \oplus H(iter\_count)
$$

3. Cuối cùng, tất cả các khối $KHi$ nối lại với nhau sẽ cho ra khóa $K$:

$$
K = KH_1 \parallel KH_2 \parallel \dots \parallel KH(key\_len / h_{len})
$$
