Sha512 php

nhật ký ILog chỉ đọc tĩnh riêng tư = LogManager. GetLogger(Hệ thống. Sự phản xạ. Phương thứcBase. GetCurrentMethod(). Loại khai báo); . IsPostBack) { txtOrderDesc. Text = "Nhap noi dung thanh toan"; . Văn bản = Ngày Giờ. Bây giờ. Thêm Phút(15). ToString("yyyyMMddHHmmss"); . AppSettings["vnp_Returnurl"]; . Cài đặt ứng dụng["vnp_Url"]; . AppSettings["vnp_TmnCode"]; . AppSettings["vnp_HashSecret"]; . IsNullOrEmpty(vnp_TmnCode). chuỗi. IsNullOrEmpty(vnp_HashSecret)) { lblMessage. Text = "Vui lòng cấu hình các tham số. vnp_TmnCode,vnp_HashSecret trong file web. config"; return; } //Nhận đầu vào thanh toán OrderInfo order = new OrderInfo(); //Lưu đơn hàng vào db order. OrderId = DateTime. Bây giờ. bọ ve; . Số tiền = 100000; . Trạng thái = "0"; . Trạng thái thanh toán Lệnh "chờ thanh toán" hoặc lệnh "Pending". OrderDesc = txtOrderDesc. Chữ; . Ngày tạo = Ngày giờ. Bây giờ; . Chọn mục. Giá trị; . AddRequestData("vnp_Version", VnPayLibrary. PHIÊN BẢN); . AddRequestData("vnp_Command", "thanh toán"); . AddRequestData("vnp_TmnCode", vnp_TmnCode); . AddRequestData("vnp_Amount", (đơn hàng. Số tiền * 100). ToString()); . Số tiền không mang các ký tự phân tách thập phân, bộ lọc, ký tự tiền tệ. Để gửi số tiền thanh toán là 100.000 VND (một phần trăm trị giá VNĐ), người bán cần nhân thêm 100 lần (khử thập phân), sau đó gửi sang VNPAY là. 10000000 nếu (mã cboBank. Chọn mục. = vô &&. chuỗi. IsNullOrEmpty(cboBankCode. Chọn mục. Giá trị)) { vnpay. AddRequestData("vnp_BankCode", cboBankCode. Chọn mục. Giá trị); . AddRequestData("vnp_CreateDate", đơn đặt hàng. Ngày tạo ra. ToString("yyyyMMddHHmmss")); . AddRequestData("vnp_CurrCode", "VND"); . AddRequestData("vnp_IpAddr", Utils. GetIpAddress()); . chuỗi. IsNullOrEmpty(ngôn ngữ)) { vnpay. AddRequestData("vnp_Locale", ngôn ngữ); . AddRequestData("vnp_Locale", "vn"); . AddRequestData("vnp_OrderInfo", "Thanh toan don hang. " + đặt hàng. Mã đặt hàng); . AddRequestData("vnp_OrderType", danh mục đơn hàng. Chọn mục. Giá trị); . khác vnpay. AddRequestData("vnp_ReturnUrl", vnp_Returnurl); . AddRequestData("vnp_TxnRef", lệnh. Id đặt hàng. ToString()); . Mã này được sử dụng duy nhất để phân biệt các đơn hàng gửi sang VNPAY. Không thể lặp lại trong ngày //Add Params of 2. 1. 0 Phiên bản vnpay. AddRequestData("vnp_ExpireDate",txtExpire. Chữ); . AddRequestData("vnp_Bill_Mobile", txt_billing_mobile. Chữ. Cắt ()); . AddRequestData("vnp_Bill_Email", txt_billing_email. Chữ. Cắt ()); . Chữ. Cắt (); . Chuỗi. IsNullOrEmpty(fullName)) { var indexof = fullName. Chỉ số(' '); . AddRequestData("vnp_Bill_FirstName", fullName. Chuỗi con(0, indexof)); . AddRequestData("vnp_Bill_LastName", fullName. Chuỗi con(indexof + 1, fullName. Chiều dài - indexof - 1)); . AddRequestData("vnp_Bill_Address", txt_inv_addr1. Chữ. Cắt ()); . AddRequestData("vnp_Bill_City", txt_bill_city. Chữ. Cắt ()); . AddRequestData("vnp_Bill_Country", txt_bill_country. Chữ. Cắt ()); . AddRequestData("vnp_Bill_State", ""); . AddRequestData("vnp_Inv_Phone", txt_inv_mobile. Chữ. Cắt ()); . AddRequestData("vnp_Inv_Email", txt_inv_email. Chữ. Cắt ()); . AddRequestData("vnp_Inv_Customer", txt_inv_customer. Chữ. Cắt ()); . AddRequestData("vnp_Inv_Address", txt_inv_addr1. Chữ. Cắt ()); . AddRequestData("vnp_Inv_Company", txt_inv_company. Chữ); . AddRequestData("vnp_Inv_Taxcode", txt_inv_taxcode. Chữ); . AddRequestData("vnp_Inv_Type", cbo_inv_type. Chọn mục. Giá trị); . CreateRequestUrl(vnp_Url, vnp_HashSecret); . InfoFormat("URL VNPAY. {0}", thanh toánUrl); Phản hồi. Chuyển hướng(thanh toánUrl);

Điều cần thiết là lưu trữ mật khẩu theo cách ngăn kẻ tấn công lấy được chúng ngay cả khi ứng dụng hoặc cơ sở dữ liệu bị xâm phạm. Phần lớn các ngôn ngữ và khung hiện đại cung cấp chức năng tích hợp để giúp lưu trữ mật khẩu một cách an toàn

Sau khi kẻ tấn công có được các hàm băm mật khẩu được lưu trữ, chúng luôn có thể thực hiện các hàm băm ngoại tuyến. Là một người phòng thủ, chỉ có thể làm chậm các cuộc tấn công ngoại tuyến bằng cách chọn các thuật toán băm càng tốn nhiều tài nguyên càng tốt

Bảng cheat này cung cấp hướng dẫn về các lĩnh vực khác nhau cần được xem xét liên quan đến việc lưu trữ mật khẩu. Nói ngắn gọn

  • Sử dụng Argon2id với cấu hình tối thiểu 15 MiB bộ nhớ, số lần lặp là 2 và 1 mức độ song song
  • Nếu không có Argon2id, hãy sử dụng scrypt với tham số chi phí CPU/bộ nhớ tối thiểu là (2^16), kích thước khối tối thiểu là 8 (1024 byte) và tham số song song hóa là 1
  • Đối với các hệ thống cũ sử dụng bcrypt, hãy sử dụng hệ số công việc từ 10 trở lên và giới hạn mật khẩu là 72 byte
  • Nếu yêu cầu tuân thủ FIPS-140, hãy sử dụng PBKDF2 với hệ số công việc từ 310.000 trở lên và được đặt bằng hàm băm nội bộ của HMAC-SHA-256
  • Cân nhắc sử dụng hạt tiêu để cung cấp khả năng phòng thủ bổ sung theo chiều sâu (mặc dù khi sử dụng riêng lẻ, nó không cung cấp các đặc tính an toàn bổ sung)

Tiểu sử¶

Băm so với mã hóa¶

Băm và mã hóa đều cung cấp các cách để giữ an toàn cho dữ liệu nhạy cảm. Tuy nhiên, trong hầu hết mọi trường hợp, mật khẩu nên được băm nhỏ, KHÔNG được mã hóa

Băm là một chức năng một chiều (i. e. , không thể "giải mã" một hàm băm và lấy giá trị văn bản gốc). Băm thích hợp để xác thực mật khẩu. Ngay cả khi kẻ tấn công lấy được mật khẩu đã băm, họ cũng không thể nhập mật khẩu đó vào trường mật khẩu của ứng dụng và đăng nhập với tư cách nạn nhân

Mã hóa là một chức năng hai chiều, có nghĩa là văn bản gốc có thể được truy xuất. Mã hóa phù hợp để lưu trữ dữ liệu như địa chỉ của người dùng vì dữ liệu này được hiển thị ở dạng văn bản gốc trên hồ sơ của người dùng. Băm địa chỉ của họ sẽ dẫn đến một mớ hỗn độn

Trong bối cảnh lưu trữ mật khẩu, mã hóa chỉ nên được sử dụng trong các trường hợp cần thiết để lấy mật khẩu văn bản gốc. Điều này có thể cần thiết nếu ứng dụng cần sử dụng mật khẩu để xác thực với một hệ thống khác không hỗ trợ cách hiện đại để cấp quyền truy cập theo chương trình, chẳng hạn như OpenID Connect (OIDC). Nếu có thể, nên sử dụng một kiến ​​trúc thay thế để tránh phải lưu trữ mật khẩu ở dạng mã hóa

Để được hướng dẫn thêm về mã hóa, hãy xem Bảng gian lận lưu trữ mật mã

Cách kẻ tấn công bẻ khóa mật khẩu¶

Mặc dù không thể "giải mã" các hàm băm mật khẩu để lấy mật khẩu gốc, nhưng có thể "bẻ khóa" các hàm băm trong một số trường hợp

Các bước cơ bản là

  • Chọn một mật khẩu mà bạn cho rằng nạn nhân đã chọn (e. g. password1!)
  • Tính hàm băm
  • So sánh hàm băm bạn đã tính với hàm băm của nạn nhân. Nếu chúng khớp, bạn đã "bẻ khóa" chính xác hàm băm và bây giờ biết giá trị văn bản gốc của mật khẩu của họ

Quá trình này được lặp lại cho một số lượng lớn các mật khẩu tiềm năng. Các phương pháp khác nhau có thể được sử dụng để chọn mật khẩu ứng cử viên, bao gồm

  • Danh sách mật khẩu thu được từ các trang web bị xâm nhập khác
  • Brute force (thử mọi ứng cử viên có thể)
  • Từ điển hoặc danh sách từ của mật khẩu phổ biến

Mặc dù số lượng hoán vị có thể rất lớn, nhưng với phần cứng tốc độ cao (chẳng hạn như GPU) và dịch vụ đám mây với nhiều máy chủ cho thuê, chi phí cho kẻ tấn công là tương đối nhỏ để bẻ khóa thành công mật khẩu, đặc biệt là khi không tuân theo các phương pháp băm tốt nhất

Mật khẩu mạnh được lưu trữ bằng các thuật toán băm hiện đại và sử dụng các phương pháp băm tốt nhất sẽ khiến kẻ tấn công không thể bẻ khóa một cách hiệu quả. Bạn có trách nhiệm với tư cách là chủ sở hữu ứng dụng để chọn thuật toán băm hiện đại

Khái niệm lưu trữ mật khẩu¶

Ướp muối¶

Muối là một chuỗi duy nhất, được tạo ngẫu nhiên, được thêm vào mỗi mật khẩu như một phần của quy trình băm. Vì muối là duy nhất cho mỗi người dùng, kẻ tấn công phải bẻ khóa từng lần một bằng cách sử dụng muối tương ứng thay vì tính toán một lần băm và so sánh nó với mọi hàm băm được lưu trữ. Điều này làm cho việc bẻ khóa số lượng lớn các hàm băm khó hơn đáng kể, vì thời gian cần thiết tăng tỷ lệ thuận với số lượng hàm băm

Salting cũng bảo vệ chống lại các hàm băm trước khi tính toán của kẻ tấn công bằng cách sử dụng bảng cầu vồng hoặc tra cứu dựa trên cơ sở dữ liệu. Cuối cùng, tạo muối có nghĩa là không thể xác định xem hai người dùng có cùng mật khẩu hay không mà không bẻ khóa các giá trị băm, vì các loại muối khác nhau sẽ dẫn đến các giá trị băm khác nhau ngay cả khi mật khẩu giống nhau

Các thuật toán băm hiện đại như Argon2id, bcrypt và PBKDF2 tự động thêm mật khẩu, vì vậy không cần thực hiện thêm bước nào khi sử dụng chúng

tiêu¶

Hạt tiêu có thể được sử dụng ngoài muối để tạo thêm một lớp bảo vệ. Mục đích của pepper là ngăn kẻ tấn công không thể bẻ khóa bất kỳ mã băm nào nếu chúng chỉ có quyền truy cập vào cơ sở dữ liệu, chẳng hạn như nếu chúng đã khai thác lỗ hổng SQL injection hoặc lấy được bản sao lưu của cơ sở dữ liệu

Một trong số các chiến lược tiêu là băm mật khẩu như bình thường (sử dụng thuật toán băm mật khẩu) và sau đó HMAC hoặc mã hóa các giá trị băm bằng khóa mã hóa đối xứng trước khi lưu trữ mật khẩu băm trong cơ sở dữ liệu, với khóa đóng vai trò là tiêu. Chiến lược Peppering không ảnh hưởng đến chức năng băm mật khẩu theo bất kỳ cách nào

  • Hạt tiêu được chia sẻ giữa các mật khẩu được lưu trữ, thay vì là duy nhất như muối
  • Không giống như muối mật khẩu, hạt tiêu không nên được lưu trữ trong cơ sở dữ liệu
  • Ớt là bí mật và nên được lưu trữ trong "hầm bí mật" hoặc HSM (Mô-đun bảo mật phần cứng)
  • Giống như bất kỳ khóa mật mã nào khác, chiến lược xoay tiêu nên được xem xét

Yếu tố công việc¶

Hệ số công việc về cơ bản là số lần lặp lại của thuật toán băm được thực hiện cho mỗi mật khẩu (thông thường, nó thực sự là ____1 lần lặp lại). Mục đích của yếu tố công việc là làm cho việc tính toán hàm băm trở nên tốn kém hơn về mặt tính toán, do đó làm giảm tốc độ và/hoặc tăng chi phí mà kẻ tấn công có thể cố gắng bẻ khóa hàm băm mật khẩu. Hệ số công việc thường được lưu trữ trong đầu ra hàm băm

Khi chọn một yếu tố công việc, cần cân bằng giữa bảo mật và hiệu suất. Các yếu tố công việc cao hơn sẽ khiến cho kẻ tấn công khó bẻ khóa hơn nhưng cũng sẽ khiến quá trình xác minh nỗ lực đăng nhập chậm hơn. Nếu hệ số công việc quá cao, điều này có thể làm giảm hiệu suất của ứng dụng và cũng có thể bị kẻ tấn công sử dụng để thực hiện tấn công từ chối dịch vụ bằng cách thực hiện một số lượng lớn các nỗ lực đăng nhập để làm cạn kiệt CPU của máy chủ

Không có quy tắc vàng nào cho yếu tố công việc lý tưởng - nó sẽ phụ thuộc vào hiệu suất của máy chủ và số lượng người dùng trên ứng dụng. Việc xác định hệ số công việc tối ưu sẽ yêu cầu thử nghiệm trên (các) máy chủ cụ thể được ứng dụng sử dụng. Theo nguyên tắc chung, việc tính toán hàm băm sẽ mất ít hơn một giây

Nâng cấp Hệ số công việc¶

Một lợi thế chính của việc có hệ số công việc là nó có thể tăng lên theo thời gian khi phần cứng trở nên mạnh hơn và rẻ hơn

Cách tiếp cận phổ biến nhất để nâng cấp hệ số công việc là đợi cho đến khi người dùng xác thực lần tiếp theo và sau đó băm lại mật khẩu của họ với hệ số công việc mới. Điều này có nghĩa là các hàm băm khác nhau sẽ có hệ số công việc khác nhau và có thể dẫn đến các hàm băm không bao giờ được nâng cấp nếu người dùng không đăng nhập lại vào ứng dụng. Tùy thuộc vào ứng dụng, có thể thích hợp để xóa các hàm băm mật khẩu cũ hơn và yêu cầu người dùng đặt lại mật khẩu của họ vào lần đăng nhập tiếp theo để tránh lưu trữ các hàm băm cũ hơn và kém an toàn hơn

Thuật toán băm mật khẩu¶

Có một số thuật toán băm hiện đại đã được thiết kế đặc biệt để lưu trữ mật khẩu một cách an toàn. Điều này có nghĩa là chúng phải chậm (không giống như các thuật toán như MD5 và SHA-1, vốn được thiết kế để có tốc độ nhanh) và mức độ chậm của chúng có thể được định cấu hình bằng cách thay đổi hệ số công việc

Các trang web không nên ẩn thuật toán băm mật khẩu mà họ sử dụng. Nếu bạn sử dụng một thuật toán băm mật khẩu hiện đại với các tham số cấu hình phù hợp, thì sẽ an toàn khi công bố công khai thuật toán băm mật khẩu nào đang được sử dụng và được liệt kê tại đây

Ba thuật toán chính cần được xem xét được liệt kê dưới đây

Argon2id¶

Argon2 là người chiến thắng trong Cuộc thi băm mật khẩu 2015. Có ba phiên bản khác nhau của thuật toán và biến thể Argon2id nên được sử dụng vì nó cung cấp một cách tiếp cận cân bằng để chống lại cả các cuộc tấn công dựa trên kênh phụ và dựa trên GPU

Thay vì một hệ số công việc đơn giản như các thuật toán khác, Argon2id có ba tham số khác nhau có thể được cấu hình. Argon2id nên sử dụng một trong các cài đặt cấu hình sau làm mức tối thiểu cơ sở bao gồm kích thước bộ nhớ tối thiểu (m), số lần lặp tối thiểu (t) và mức độ song song (p)

  • m=37 MiB, t=1, p=1
  • m=15 MiB, t=2, p=1

Cả hai cài đặt cấu hình này đều tương đương nhau về khả năng bảo vệ mà chúng cung cấp. Sự khác biệt duy nhất là sự đánh đổi giữa việc sử dụng CPU và RAM

mã hóa¶

scrypt là một chức năng dẫn xuất khóa dựa trên mật khẩu được tạo bởi Colin Percival. Mặc dù các hệ thống mới nên xem xét Argon2id để băm mật khẩu, nhưng scrypt phải được định cấu hình đúng cách khi được sử dụng trong các hệ thống cũ

Giống như Argon2id, scrypt có ba tham số khác nhau có thể được cấu hình. scrypt nên sử dụng một trong các cài đặt cấu hình sau làm mức tối thiểu cơ sở bao gồm tham số chi phí CPU/bộ nhớ tối thiểu (N), kích thước khối (r) và mức độ song song (p)

  • N=2^16 (64 MiB), r=8 (1024 byte), p=1
  • N=2^15 (32 MiB), r=8 (1024 byte), p=2
  • N=2^14 (16 MiB), r=8 (1024 byte), p=4
  • N=2^13 (8 MiB), r=8 (1024 byte), p=8
  • N=2^12 (4 MiB), r=8 (1024 byte), p=15

Các cài đặt cấu hình này tương đương nhau về mặt bảo vệ mà chúng cung cấp. Sự khác biệt duy nhất là sự đánh đổi giữa việc sử dụng CPU và RAM

bcrypt¶

Hàm băm mật khẩu bcrypt phải là lựa chọn thứ hai để lưu trữ mật khẩu nếu Argon2id không khả dụng hoặc cần có PBKDF2 để đạt được sự tuân thủ FIPS-140

Hệ số công việc phải lớn như hiệu suất máy chủ xác minh cho phép, với tối thiểu là 10

Giới hạn đầu vào¶

bcrypt có độ dài đầu vào tối đa là 72 byte cho hầu hết các triển khai. Để bảo vệ trước sự cố này, nên thực thi độ dài mật khẩu tối đa là 72 byte (hoặc ít hơn nếu việc triển khai đang sử dụng có giới hạn nhỏ hơn) khi sử dụng bcrypt

Mật khẩu băm trước¶

Một cách tiếp cận khác là băm trước mật khẩu do người dùng cung cấp bằng thuật toán nhanh như SHA-256, sau đó băm kết quả băm bằng bcrypt (i. e. , bcrypt(base64(hmac-sha256(data:$password, key:$pepper)), $salt, $cost)). Đây là một cách làm nguy hiểm (nhưng phổ biến) nên tránh do bị xáo trộn mật khẩu và các vấn đề khác khi kết hợp bcrypt với các hàm băm khác

PBKDF2¶

PBKDF2 được NIST khuyến nghị và đã triển khai FIPS-140 được xác thực. Vì vậy, nó phải là thuật toán ưa thích khi chúng được yêu cầu

PBKDF2 yêu cầu bạn chọn thuật toán băm nội bộ, chẳng hạn như HMAC hoặc nhiều thuật toán băm khác. HMAC-SHA-256 được hỗ trợ rộng rãi và được NIST khuyên dùng

Hệ số công việc cho PBKDF2 được triển khai thông qua số lần lặp, hệ số này sẽ được đặt khác nhau dựa trên thuật toán băm nội bộ được sử dụng

  • PBKDF2-HMAC-SHA1. 720.000 lần lặp
  • PBKDF2-HMAC-SHA256. 310.000 lần lặp
  • PBKDF2-HMAC-SHA512. 120.000 lần lặp

Các cài đặt cấu hình này tương đương nhau về mặt bảo vệ mà chúng cung cấp

Khi PBKDF2 được sử dụng với HMAC và mật khẩu dài hơn kích thước khối của hàm băm (64 byte cho SHA-256), mật khẩu sẽ được băm trước tự động. Ví dụ: mật khẩu "Đây là mật khẩu dài hơn 512 bit, là kích thước khối của SHA-256" được chuyển đổi thành giá trị băm (ở dạng hex) fa91498c139805af73f7ba275cca071e78d78675027000c99a9925e2ec92eedd. Việc triển khai PBKDF2 tốt sẽ thực hiện bước này trước giai đoạn băm lặp lại tốn kém, nhưng một số triển khai thực hiện chuyển đổi trên mỗi lần lặp. Điều này có thể làm cho việc băm mật khẩu dài đắt hơn đáng kể so với việc băm mật khẩu ngắn. Nếu người dùng có thể cung cấp mật khẩu rất dài, thì có khả năng xảy ra lỗ hổng từ chối dịch vụ, chẳng hạn như lỗ hổng được xuất bản ở Django vào năm 2013. Băm trước thủ công có thể giảm rủi ro này nhưng yêu cầu thêm muối vào bước băm trước

Nâng cấp Băm kế thừa¶

Đối với các ứng dụng cũ hơn được xây dựng bằng các thuật toán băm kém an toàn hơn như MD5 hoặc SHA-1, các hàm băm này phải được nâng cấp lên các thuật toán băm mật khẩu hiện đại như được mô tả ở trên. Khi người dùng nhập mật khẩu của họ vào lần tiếp theo (thường bằng cách xác thực trên ứng dụng), mật khẩu đó sẽ được băm lại bằng thuật toán mới. Cũng nên thực hiện hết hạn mật khẩu hiện tại của người dùng và yêu cầu họ nhập mật khẩu mới để mọi hàm băm cũ hơn (kém an toàn hơn) trong mật khẩu của họ không còn hữu ích đối với kẻ tấn công

Tuy nhiên, cách tiếp cận này có nghĩa là các hàm băm mật khẩu cũ (kém an toàn hơn) sẽ được lưu trữ trong cơ sở dữ liệu cho đến khi người dùng đăng nhập. Hai cách tiếp cận chính có thể được thực hiện để tránh tình trạng tiến thoái lưỡng nan này

Một phương pháp là hết hạn và xóa mật khẩu băm của những người dùng không hoạt động trong một thời gian dài và yêu cầu họ đặt lại mật khẩu để đăng nhập lại. Mặc dù an toàn nhưng phương pháp này không đặc biệt thân thiện với người dùng. Việc hết hạn mật khẩu của nhiều người dùng có thể gây ra sự cố cho nhân viên hỗ trợ hoặc có thể được người dùng hiểu là dấu hiệu vi phạm

Một cách tiếp cận khác là sử dụng hàm băm mật khẩu hiện có làm đầu vào cho một thuật toán an toàn hơn. Ví dụ: nếu ứng dụng lưu trữ mật khẩu ban đầu là md5($password), mật khẩu này có thể dễ dàng nâng cấp lên bcrypt(md5($password)). Phân lớp các giá trị băm tránh nhu cầu biết mật khẩu ban đầu; . Những giá trị băm này sẽ được thay thế bằng giá trị băm trực tiếp mật khẩu của người dùng vào lần tiếp theo khi người dùng đăng nhập

Giả sử rằng bất kỳ phương pháp băm mật khẩu nào được chọn sẽ phải được nâng cấp trong tương lai. Đảm bảo rằng việc nâng cấp thuật toán băm của bạn dễ dàng nhất có thể. Trong giai đoạn chuyển tiếp, cho phép kết hợp các thuật toán băm cũ và mới. Sử dụng kết hợp các thuật toán băm sẽ dễ dàng hơn nếu thuật toán băm mật khẩu và hệ số công việc được lưu trữ cùng với mật khẩu bằng định dạng chuẩn, ví dụ: định dạng chuỗi PHC mô-đun

Ký tự quốc tế¶

Đảm bảo thư viện băm của bạn có thể chấp nhận nhiều loại ký tự và tương thích với tất cả các điểm mã Unicode. Người dùng sẽ có thể sử dụng đầy đủ các ký tự có sẵn trên các thiết bị hiện đại, đặc biệt là bàn phím di động. Họ sẽ có thể chọn mật khẩu từ nhiều ngôn ngữ khác nhau và bao gồm các chữ tượng hình. Trước khi băm, entropy của mục nhập của người dùng không được giảm. Các thư viện băm mật khẩu cần có khả năng sử dụng đầu vào có thể chứa byte NULL