2015-02-23 13 views
5

Tôi đã khám phá Twin-Bcrypt thư viện JavaScript và đã tìm thấy một điều kỳ lạ. Tại một thời điểm, tôi đã tạo muối của riêng tôi ở phía máy chủ với PHP base64_encode(openssl_random_pseudo_bytes(16)) và sử dụng nó trong hàm TwinBcrypt.hash(), phản hồi muối đó không hợp lệ do mẫu không khớp thường xuyên trong thư viện. Vì vậy, mô hình là:JS Mẫu mã Twin-Bcrypt

var SALT_PATTERN = /^\$2[ay]\$(0[4-9]|[12][0-9]|3[01])\$[.\/A-Za-z0-9]{21}[.Oeu]/; 

và có vẻ tốt cho muối của tôi, ngoại trừ một điều - cái quái gì thế này - [.Oeu]?

câu hỏi đầu tiên của tôi là, tại sao họ mong đợi từ muối kết thúc với một dấu chấm , hoặc O, hoặc e, hoặc u? Theo như tôi biết openssl_random_pseudo_bytes() tạo an toàn CSPRNG, nhưng vì thư viện JS mẫu không muốn chấp nhận nó.

Câu hỏi thứ hai - có lý do bảo mật nào cho muối kết thúc bằng mẫu /[.Oeu]/ không?

Tôi sẽ rất biết ơn vì bất kỳ trợ giúp nào, bởi vì không có nhiều thông tin về nó.

Trả lời

4

Tôi không biết bcrypt thực sự tốt, nhưng có vẻ như Twin-bcrypt hy vọng tham số salt bao gồm đầy đủ loại-tag (2a/2y/2x), thông số chi phí, giá trị muối mật mã thực tế . (Tôi tin rằng điều này được thực hiện để phù hợp với sự mong đợi của các thư viện khác.) Giá trị muối mật mã chỉ là 22 ký tự cuối cùng của chuỗi tham số salt, đại diện cho giá trị 128 bit.

Để thực sự giải quyết vấn đề của bạn, bạn sẽ cần phải làm hai việc:

  1. Prefix muối của bạn với $2y$10$ để nó có một loại-tag và một tham số chi phí.

  2. Lập bản đồ kết quả PHP base64_encode của bạn vào các giá trị base64 không chuẩn của bcrypt. Để tham khảo, các giá trị là:

    Standard: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/ 
    bcrypt: ./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
    

    Nếu bạn chỉ muốn thực hiện một base64 tiêu chuẩn vào một chuỗi brcypt-base64, bạn có thể thay thế tất cả + với ., nhưng điều đó sẽ dẫn đến một giá trị khác nhau (vì tiêu chuẩn +62 trong khi .0 và tất cả các giá trị khác cũng được bù trừ). Nếu bạn muốn một chuỗi brypt có cùng giá trị với bản gốc, bạn sẽ cần phải thay thế từng ký tự bằng bcrypt tương đương.

    Bạn cũng có thể cần phải loại bỏ đường nhỏ = khỏi chuỗi chuẩn, nếu có.


Thông tin thêm: Tại sao muối phải kết thúc với [.Oeu]?

Một muối trong bcrypt là 128 bit. Mỗi ký tự base64 truyền đạt 6 bit thông tin.Điều đó có nghĩa rằng 21 ký tự base64 có thể truyền thông đồng đều 126 bit. 2 bit cuối cùng phải được mã hóa trong ký tự cuối cùng thứ 22. Vì ký tự đó được xác định bởi chỉ 2 bit, nó chỉ có thể có 4 giá trị có thể.

Khi chúng ta xem xét các hồ bơi nhân vật base64 cho brypt, chúng ta thấy:

./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

Đếm từ số không, chúng ta thấy rằng những giá trị xuất hiện ở indicies:

. => 0 = 000000 
O => 16 = 010000 
e => 32 = 100000 
u => 48 = 110000 

Vì vậy, hai bit cuối cùng là thiết lập các bit cao cấp của ký tự cuối cùng.

+0

Điều này sẽ được thêm vào Wiki. Cảm ơn bạn rất nhiều! – Nevertheless