tất cả việc băm sẽ làm là giới thiệu nhiều tính ngẫu nhiên hơn
Không. Bạn không thể giới thiệu tính ngẫu nhiên với một quy trình xác định. Bạn chỉ có thể giới thiệu tính ngẫu nhiên với một nguồn dữ liệu ngẫu nhiên thực tế.
Bạn có thể sử dụng hàm băm như một thành phần của một trình tạo giả ngẫu nhiên và một trình tạo giả ngẫu nhiên (an toàn về mật mã!) đủ tốt cho mật mã khi cần tính ngẫu nhiên, nhưng một thành phần quan trọng khác của trình tạo giả ngẫu nhiên là một bí mật. Bí mật đó là trạng thái của trình tạo ngẫu nhiên, bắt nguồn từ hạt giống ngẫu nhiên: trình tạo giả ngẫu nhiên không tạo ra tính ngẫu nhiên, nó chỉ “nhân lên” theo nghĩa là nó có thể biến một lượng nhỏ dữ liệu ngẫu nhiên thành một lượng lớn dữ liệu ngẫu nhiên. lượng dữ liệu ngẫu nhiên.
Băm một chuỗi ngẫu nhiên chỉ làm giảm tính ngẫu nhiên của nó: về mặt lý thuyết, có thể hai chuỗi đầu vào có cùng một hàm băm (bạn sẽ không thực sự tìm thấy các chuỗi như vậy và chúng tôi không chắc chúng tồn tại, nhưng rất có thể là có). Tính ngẫu nhiên chỉ giảm đi một lượng nhỏ, vì vậy đây không phải là một lỗ hổng thực sự trong mã của bạn, nhưng nó là một sự phức tạp không cần thiết và phản tác dụng.
Cách để tối đa hóa tính ngẫu nhiên là lấy đầu ra từ một trình tạo ngẫu nhiên. Cuộc gọi rng.GetBytes(khóa bí mật)
và dừng lại ở đó.
Chuyển đổi khóa thành Base64 để vận chuyển và sau đó quay lại nhị phân để sử dụng không ảnh hưởng đến mật mã. Nó chỉ là một mã hóa. Hãy giải mã nó: sử dụng Base64 làm khóa có thể làm giảm tính bảo mật vì mỗi byte chỉ có thể có 1/4 giá trị có thể. (Cách HMAC sử dụng khóa của nó, việc bạn sử dụng cơ sở64(random_bytes(64))
hoặc Random_bytes(64)
như một chìa khóa; nhưng điều này sẽ quan trọng, ví dụ, đối với khóa AES, thậm chí không có độ dài chấp nhận được.)