Computer >> Máy Tính >  >> Lập trình >> Ruby

Cập nhật bảo mật tài khoản

Bạn đã muốn vứt bỏ hóa đơn internet đắt tiền của mình và sử dụng wifi không an toàn của hàng xóm? Điều duy nhất có khiến bạn cản trở quy trình xác thực một yếu tố của Honeybadger không? À, tôi có tin gì cho bạn không.

Thông báo:Xác thực hai yếu tố (2FA)

Tất cả chuyện đùa sang một bên, chúng tôi rất coi trọng vấn đề bảo mật. Chúng tôi rất vui khi có thể cung cấp một công cụ quan trọng giúp giữ cho người dùng và dữ liệu của họ an toàn hơn.

Tôi nghĩ tôi chỉ có thể giải thích cách kích hoạt 2FA, nhưng điều đó thú vị là gì? Còn về việc chúng ta có một cái nhìn nhẹ nhàng về thế giới mật mã hoang dã và tìm hiểu cách hoạt động của 2FA.

Nếu niềm vui không phải là điều của bạn, bạn hoàn toàn có thể chuyển thẳng đến Cách kích hoạt, cảm xúc của tôi sẽ không bị tổn thương.

⚠️ Cảnh báo:Một số lý thuyết bên dưới

Nhiều triển khai 2FA được xây dựng dựa trên thuật toán gọi là Mật khẩu dùng một lần dựa trên thời gian ( TOTP ). Cuộn ngay khỏi lưỡi.

Một lần?

Có, cái hay của phương pháp này là bạn không phải truyền cùng một "mật khẩu" mỗi khi bạn đăng nhập. Sử dụng ứng dụng xác thực, "mật khẩu" một lần được tạo và duy trì hiệu lực trong một thời gian ngắn (thường là 30 giây) , điều này làm giảm đáng kể hiệu quả của một cuộc tấn công malcolm-in-the-middle.

Mặc dù có một số bit phức tạp, nhưng việc triển khai tổng thể tương đối đơn giản.

Bí mật

A Chìa khóa điểm để hiểu về TOTP đó có phải là máy chủ (người xác minh) không và người xác thực (tục ngữ) phải có một bí mật được chia sẻ. Đây là thực "password", tuy nhiên nó chỉ được truyền một lần (vì vậy tôi đoán đây cũng là một lần)!

Cách được khuyến nghị để tiêu thụ bí mật là thông qua mã QR. Khi bạn quét mã QR vào điện thoại thông minh của mình, bí mật sẽ được mã hóa trong một URI tiêu chuẩn trông giống như sau:

otpauth://totp/Honeybadger.io:[email protected]?secret=base32-secret-key

Có một số lợi ích khi cung cấp mã QR (trái ngược với việc tiết lộ bí mật bản rõ):

  1. Ai có thời gian để nhập mã 32 ký tự?
  2. Ứng dụng xác thực của bạn có thể cung cấp các nhãn hữu ích cho mật khẩu dùng một lần của bạn (tham chiếu email và công ty phát hành trong URI). Điều này đặc biệt hữu ích khi bạn sử dụng 2FA trên nhiều dịch vụ.
  3. Cuối cùng là một tốt lý do để sử dụng mã QR!

Có một số tham số bổ sung (hầu hết bị bỏ qua) cho otpauth mà bạn có thể xem ở đây.

MAC và tôi

Khi các bí mật đã được thống nhất với nhau 🤝, bạn sẽ được yêu cầu (tại một thời điểm nào đó) cung cấp Mật khẩu dùng một lần. Đây là nơi mọi thứ trở thành hiện thực .

TOTP được xây dựng dựa trên một thuật toán khác được gọi là Mật khẩu dùng một lần dựa trên HMAC (HOTP) , chính nó dựa trên Mã xác thực tin nhắn dựa trên băm (HMAC) . Tất cả đều là một củ hành tiền điện tử lớn.

TOTP & HOTP về cơ bản là các biến thể về thông điệp nào được băm. HMAC thực sự là nơi điều kỳ diệu xảy ra. HMAC tạo ra một thông báo, là kết quả của việc chạy một số giá trị thông qua một thuật toán băm. Hãy xem nó hoạt động với một số mã ruby:

OpenSSL::HMAC.digest("SHA1", "my-secret-key", "the-earth-is-flat")
=> "R\xABp\xCB\xEC\xFEJ\r#\x02\xC8\xAB\x96\xB68\v\xDA0\xD7z"

Chà, hãy nhìn vào chuỗi nhị phân đó! Đó là Mã xác thực tin nhắn của chúng tôi (MAC) .

Chúng tôi đã chọn SHA1 dưới dạng hàm băm của chúng tôi (cũng như việc triển khai TOTP của chúng tôi ). Có nhiều chức năng khác để lựa chọn, mỗi chức năng đều có ý nghĩa về bảo mật và hiệu suất riêng. Điều cơ bản về thuật toán băm là đối với bất kỳ đầu vào nào , chúng tôi sẽ nhận được cùng một đầu ra , mỗi lần! Nó cũng sẽ tạo ra một rất khác biệt và độc đáo đầu ra từ bất kỳ thay đổi đầu vào tinh vi nào (ahem, tùy thuộc vào hàm băm, nhưng đừng lo lắng, chúng tôi không quá lo lắng về các xung đột ở đây).

Được rồi, vì vậy nó được gọi là Mã xác thực tin nhắn bởi vì nó có thể được sử dụng để chứng minh rằng một tin nhắn nhận được là xác thực. Nếu bạn và tôi biết bí mật (my-secret-key ), Tôi có thể gửi cho bạn tin nhắn the-earth-is-flat cùng với MAC . Tất cả những gì bạn cần làm là chạy cùng một hàm thông báo chính xác, với các đầu vào giống nhau và nếu các MAC khớp với nhau, bạn đã xác thực thông báo! Bạn biết đấy, nó không bị giả mạo và chỉ có thể đến từ tôi!

😎

Mã thời gian

Vì vậy, hãy đưa điều này trở lại TOTP . Đã đến lúc nói về thời gian . Bạn thấy đấy, với TOTP , thay vì đọc một thông điệp phi lý như the-earth-is-flat , thay vào đó, chúng tôi sử dụng số bước thời gian (được chuyển đổi thành chuỗi) làm đầu vào. Nếu bạn mở ứng dụng trình xác thực của mình và xem khi mã được chuyển đổi, bạn có thể nhận thấy một hình mẫu. Đúng vậy, hãy nói với tôi:"Họ bật phút rưỡi", rất tốt.

Điều này làm cho việc tính toán tin nhắn đơn giản hơn một chút. Trong trường hợp này, chúng tôi sử dụng số 30 giây làm tròn xuống ( bước thời gian ) kể từ đầu thời gian (tốt, thời gian unix). Vì vậy, trong ruby ​​một lần nữa:

Time.now.to_i / 30
=> 51772900

À há! Đó là Thông điệp của chúng tôi .

Vì vậy, trong ứng dụng Authenticator của chúng tôi, chúng tôi sử dụng chức năng thông báo đáng tin cậy của mình để nhận HMAC mới :

hmac = OpenSSL::HMAC.digest("SHA1", "avwe8aw71j2boib23jkbjk32", "51772900")
=> "H\x7F\xC1\xACL\xDA\xDB\xE7DQ\x91kE\x1C\xE3,c\nH\xA0"
get_otp_code(hmac)
=> "332204"

Bước cuối cùng là lấy mã số từ chuỗi nhị phân này. Vì cần có một số thao tác bit, tôi sẽ ẩn đằng sau get_otp_code ẩn danh của chúng tôi chức năng cho bây giờ. Nếu muốn, bạn có thể đọc về cách nó hoạt động trong Thông số HOTP.

Khi bạn gửi mã đến máy chủ, nó sẽ thực hiện hoạt động thông báo giống hệt nhau và so sánh các mã. Khi chúng khớp với nhau, bạn đang ở! Bởi vì chúng tôi đang làm việc với thời gian, độ trễ là một yếu tố. Có các chiến lược để giải thích cho sự chậm trễ có thể xảy ra. Hiểu đó sẽ là bài tập về nhà của bạn, nếu bạn muốn.

Đó là ý chính của cách Mật khẩu một lần dựa trên thời gian công việc!! 🎉 Vui lòng gửi cho tôi email cảm ơn sau khi bạn sử dụng thông tin này để trở thành tâm điểm cho bữa tiệc tối tiếp theo của bạn!

Triển khai

Mặc dù tôi nghĩ rằng điều quan trọng là phải hiểu những thứ này hoạt động như thế nào, nhưng chúng tôi thực sự không khuyến khích bạn tự thực hiện bất cứ điều gì của riêng bạn liên quan đến tiền điện tử. Một trong những điều tuyệt vời về hệ sinh thái Ruby / Rails là bạn thường có thể tìm thấy một viên ngọc (đôi khi nhiều) để giải quyết vấn đề của mình.

Chúng tôi sử dụng devise ở đây tại Honeybadger và có một plugin devise tuyệt vời được gọi là two_factor_authentication. Có một số triển khai 2FA để lựa chọn, vì vậy đây là một số lý do chúng tôi chọn triển khai này:

  • Thiết lập đơn giản (di chuyển, một số cấu hình và trình khởi tạo được giới thiệu)
  • Nó cho phép nhập mã Một lần trên trang của chính nó (sau khi người dùng / mật khẩu hợp lệ)
  • Các giá trị mặc định có thể chấp nhận được, nhưng đơn giản để ghi đè
  • Nó cũng có kiểm tra số lần đăng nhập tối đa, được khuyến nghị bởi thông số kỹ thuật

Cách bật

Thiết lập rất đơn giản:Điều hướng đến trang Cài đặt người dùng> Xác thực, chọn "Thiết lập xác thực hai yếu tố" và làm theo hướng dẫn để đồng bộ hóa bí mật bằng Authy hoặc Google Authenticator (hoặc bất kỳ TOTP nào khác) ứng dụng).

Cập nhật bảo mật tài khoản

Đó là nó! Lần tới khi bạn đăng nhập, chúng tôi sẽ nhắc bạn nhập mã xác thực của bạn. Hãy điền mã đó vào và hoàn toàn yên tâm. 🧘

Cập nhật bảo mật tài khoản

An ninh và đơn giản? Nó có thể trở nên tốt hơn không?

Một điều cuối cùng:Kiểm tra mật khẩu đã Pwned

Tôi có một cái nhanh cho tất cả các bạn đề xuất mật khẩu yếu. Chúng tôi cũng tích hợp với gem devise-pwned_password. Kể từ bây giờ, khi bạn thực hiện bất kỳ thao tác nào yêu cầu mật khẩu, chúng tôi sẽ kiểm tra để đảm bảo mật khẩu được đề xuất không phổ biến trong bất kỳ vi phạm dữ liệu đã biết nào. Nếu bạn đang thêm mật khẩu mới và mật khẩu không kiểm tra được, chúng tôi sẽ không cho phép.

Nếu bạn chưa làm như vậy, chúng tôi rất khuyên bạn nên sử dụng trình quản lý mật khẩu (1Password ahem).

Một trong những điều thú vị hơn của Pwned Password là cách mật khẩu của bạn vẫn an toàn ngay cả khi kiểm tra cơ sở dữ liệu từ dịch vụ bên thứ ba. Nó được gọi là k-Anonymity và bạn có thể xem tổng quan về nó tại đây.

Chà, đó là tất cả những gì chúng ta có bây giờ. Cho đến lần sau! 👋