Bạn có thể đã nghe (hoặc thậm chí tự nói) rằng Rails / Ruby có quá nhiều ma thuật…
- Nhưng ý tưởng đó đến từ đâu?
- Ma thuật Rails chính xác là gì?
- Và bạn có thể làm gì để xóa tan điều kỳ diệu đó?
Đây là những gì tôi nghĩ :
Khi điều gì đó giống như ma thuật thì đó là vì có điều gì đó bạn không biết, có một số thông tin bị thiếu.
Nó giống như một trò ảo thuật, nếu bạn biết trò này thì không có trò ảo thuật nào .
Trong phát triển phần mềm, biết các thủ thuật tương đương với việc bạn hiểu về cách mọi thứ thực sự hoạt động .
Hãy xem một ví dụ!
Ví dụ này là về BCrypt
, một thuật toán băm được sử dụng để lưu trữ mật khẩu một cách an toàn. Nó được triển khai trong Ruby thông qua bcrypt
đá quý.
Đây là cách sử dụng BCrypt
để băm từ “kiểm tra”:
request 'bcrypt'BCrypt ::Password.create ("testing") # "$ 2a $ 10 $ 3o.xrISG8fqKfzKqDpgKn.3cwjFV // 9C9cZ7MuK5S9sNKFBivB7YG" BCrypt ::Password.create ("thử nghiệm") # " BFb / e3cWuAIyelcmkfGtE.GTifXHxig4IzVbdZs9C1zSpF / Jr6c3W "BCrypt ::Password.create (" testing ") #" $ 2a $ 10 $ Q952BVgM783Y4kPvwvxwC.CS2R0Lưu ý cách bạn nhận được một hàm băm khác nhau mỗi lần, nhưng nếu bạn sử dụng thứ gì đó như MD5 (không!) Hoặc SHA1, bạn sẽ luôn nhận được cùng một đầu ra cho một chuỗi nhất định.
Tại sao lại là
BCrypt
hành xử theo một cách khác?Tôi sẽ giải thích điều gì đang xảy ra sau một giây, nhưng trước tiên hãy xem cách bạn so sánh hai bcrypt mã băm, một mã đến từ cơ sở dữ liệu và một từ thông tin nhập của người dùng (như một biểu mẫu hoặc một cái gì đó tương tự).
BCrypt ::Password.new (@ user.hash) ==params [:password] # truePhần bên trái (
BCrypt::Password.new
) là mộtBCrypt
đối tượng, lấy băm được lưu trữ trong cơ sở dữ liệu làm tham số.Phần bên phải (
params[:password]
) là mật khẩu văn bản thuần túy mà người dùng đang cố gắng đăng nhập.Trong trường hợp này, chúng tôi giả định rằng một tổ hợp người dùng / mật khẩu phù hợp đang được sử dụng.
Vậy tại sao điều này lại đánh giá thành
true
?Để hiểu được điều này, bạn cần biết hai điều:
- BCrypt sử dụng một thứ gọi là "muối", là giá trị ngẫu nhiên được sử dụng để tăng cường bảo mật chống lại các hàm băm được tính toán trước. Muối được lưu trữ trong chính hàm băm.
- Trong Ruby, nhiều thứ trông giống như cú pháp chỉ là các phương thức . Đây là trường hợp của toán tử dấu bằng kép (
==
).Biết được điều đó, tôi có thể nói với bạn rằng
BCrypt
định nghĩa==
của riêng nó phương pháp này biết cách trích xuất giá trị "muối" đó để có thể tính đến giá trị đó khi so sánh mật khẩu.Nói cách khác :
BCrypt#==
lấy giá trị "muối" từ hàm băm được lưu trữ.Sau đó, nó băm mật khẩu văn bản thuần túy (người dùng nhập vào) bằng cách sử dụng muối này để cả hai hàm băm sẽ giống hệt nhau nếu mật khẩu hợp lệ.
Nếu bạn xem mã nguồn nó sẽ trông giống như thế này:
def ==(secret) super (BCrypt ::Engine.hash_secret (secret, @salt)) endHãy nhớ rằng
super
sẽ gọi cùng một phương thức (trong trường hợp này là==
) trên lớp cha.Lớp cha của
BCrypt::Password
làString
.Đó là Tất cả về các phương pháp
Một điều quan trọng cần hiểu là ngoài một vài từ khóa và một vài thành phần cú pháp (như dấu ngoặc đơn), tất cả đều là về các lớp &phương thức.
Nếu bạn biết mình đang làm việc với lớp nào (bạn có thể kiểm tra bằng cách sử dụng
class
phương pháp) bạn sẽ luôn có thể biết những thao tác (phương thức) nào có sẵn.Nhưng đôi khi chúng ta chỉ có một cuộc gọi phương thức mà không có một đối tượng.
Điều này thường có nghĩa là phương thức được xác định trong lớp hiện tại, nhưng không phải lúc nào cũng vậy.
Ví dụ :
đặt 123
puts
ở đâu xác định? Hãy cùng tìm hiểu:method (:put) .owner # KernelMột điều khác có thể gây nhầm lẫn là lập trình siêu hình, bởi vì với lập trình siêu hình, bạn có thể tạo, sửa đổi hoặc thậm chí loại bỏ các phương thức trong quá trình thực thi chương trình. Những điều này làm cho mã mờ hơn và tối nghĩa hơn.
Bạn có thể giảm bớt sự nhầm lẫn bằng cách biết các phương pháp lập trình siêu ứng dụng có sẵn và cách chúng hoạt động.
Tóm tắt
Bạn đã học được cách hiểu sâu sắc về cách mọi thứ hoạt động có thể giúp bạn xóa tan mọi “ma thuật”, viết mã tốt hơn và biến bạn trở thành nhà phát triển tốt hơn.
Nếu bạn muốn cải thiện kỹ năng Ruby của mình, hãy xem cuốn sách của tôi, Ruby Deep Dive, cuốn sách được thiết kế để thu hẹp khoảng cách giữa các khái niệm cơ bản và nâng cao hơn 🙂