Tất cả bài viết

Scrypt: vì sao thuật toán cần nhiều bộ nhớ đến vậy

Nhiều năm liền, Việt Nam nằm trong nhóm dẫn đầu các bảng xếp hạng mức độ phổ biến tiền mã hóa toàn cầu (như Chỉ số Chấp nhận Tiền mã hóa của Chainalysis), một phần nhờ cộng đồng chơi game và đầu tư nhỏ lẻ rất năng động. Bitcoin dùng SHA-256, nhưng Litecoin và Dogecoin — hai đồng cũng quen thuộc với người dùng Việt Nam — dùng scrypt cho proof-of-work, và đặc tính memory-hard của scrypt khiến việc chế tạo ASIC chuyên dụng cho chúng chậm và tốn kém hơn nhiều so với bitcoin.

Hàm memory-hard là gì

Một thuật toán memory-hard được thiết kế có chủ ý để việc tính một hash duy nhất đòi hỏi phải giữ trong bộ nhớ một lượng lớn dữ liệu trung gian. Việc cố tiết kiệm bộ nhớ bằng cách tính lại các giá trị sẽ làm tăng mạnh thời gian tính toán — nghĩa là kẻ tấn công phải hy sinh hoặc bộ nhớ hoặc tốc độ.

Vì sao điều này gây khó khăn cho tấn công trên phần cứng chuyên dụng

Chip ASIC và GPU rất hiệu quả trong việc thực hiện song song hàng loạt các phép tính số học đơn giản, nhưng thêm bộ nhớ vào mỗi luồng tính toán song song lại tốn kém hơn nhiều và mở rộng kém hơn. Scrypt khiến cho việc tấn công brute force trên loại phần cứng đó kém hấp dẫn về mặt kinh tế so với các hàm băm cổ điển.

Vì sao cần điều này

  • Chọn một thuật toán băm mật khẩu chống chịu được các cuộc tấn công bằng trại GPU.
  • Hiểu khái niệm hàm memory-hard trong bối cảnh mật mã học.
  • So sánh sự đánh đổi giữa scrypt với bcrypt và Argon2 cho một hệ thống cụ thể.

Thực tế cần bao nhiêu bộ nhớ

Lượng bộ nhớ cần cho một lần tính toán scrypt xấp xỉ bằng 128 × N × r byte. Với các tham số điển hình (N=16384, r=8), con số này vào khoảng 16 megabyte cho mỗi hash — không đáng kể đối với một lần đăng nhập, nhưng nếu máy chủ phải xử lý hàng nghìn lượt xác thực đồng thời, tổng lượng bộ nhớ nhanh chóng trở thành giới hạn thực sự khi lựa chọn tham số, chứ không chỉ là một yêu cầu bảo mật trừu tượng.

Dùng thử công cụ