2015-07-09 26 views
14

Gần đây tôi bắt đầu làm việc với xác thực dựa trên JWT. Sau khi người dùng đăng nhập, một token của user được tạo ra đó sẽ giống như "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ".Khóa bí mật để xác thực dựa trên JWT là gì và cách tạo nó?

Nó bao gồm ba phần được phân cách bằng dấu chấm (.). Phần đầu tiên là tiêu đề được mã hoá Base64. Sau khi giải mã chúng tôi sẽ nhận được một cái gì đó giống như { "alg": "HS256", // Thuật toán sử dụng "typ": "JWT" ​​ }

phần thứ hai là yêu cầu và Base64 mã hóa. Sau khi giải mã chúng tôi sẽ nhận được một cái gì đó giống như { "phụ": "1234567890", "tên": "John Doe", "admin": đúng }

phần thứ ba là chữ ký và được tạo ra với

HMACSHA256 ( base64UrlEncode (tiêu đề) + "" + base64UrlEncode (payload), base64 bí mật được mã hóa )

Bây giờ khóa bí mật này là gì và làm thế nào để gen tỷ lệ khóa bí mật này ??

Tôi đã thử một số trình tạo trực tuyến như "http://kjur.github.io/jsjws/tool_jwt.html" nhưng dint nhận được nhiều trợ giúp.

Trả lời

16

Thuật toán (HS256) được sử dụng để ký JWT có nghĩa là bí mật là khóa đối xứng được cả người gửi và người nhận biết. Nó được thương thảo và phân phối ra khỏi ban nhạc. Do đó, nếu bạn là người nhận dự định của mã thông báo, người gửi phải cung cấp cho bạn bí mật ngoài băng thông.

Nếu bạn là người gửi, bạn có thể sử dụng chuỗi byte tùy ý làm bí mật, nó có thể được tạo hoặc cố ý chọn. Bạn phải đảm bảo rằng bạn cung cấp bí mật cho người nhận dự định ra khỏi ban nhạc.

Đối với bản ghi, 3 phần tử trong JWT không được mã hóa base64 nhưng được mã hóa base64url, là một biến thể của mã hóa base64 dẫn đến giá trị an toàn cho URL.

3

Bạn có thể viết trình tạo của riêng mình. Khóa bí mật về bản chất là một mảng byte. Hãy chắc chắn rằng chuỗi mà bạn chuyển đổi thành một mảng byte được mã hóa base64. Trong Java bạn có thể làm một cái gì đó như thế này.

String key = "random_secret_key"; 
String base64Key = DatatypeConverter.printBase64Binary(key.getBytes()); 
byte[] secretBytes = DatatypeConverter.parseBase64Binary(base64Key); 
Các vấn đề liên quan