Access Token của EzyPlatform được tạo thế nào?
Back To BlogsCấu trúc của Access Token
Cấu trúc access token của EzyPlatform gồm 2 phần:

- Phần header có độ dài 44 byte tương đương với 44 ký tự.
- Phần body có độ dài 64 ký tự.
- Tổng độ dài của một access token là 108 ký tự.
Với độ dài này thì một ai đó muốn tấn công bằng cách tạo ngẫu nhiên access token thì có thể phải mất ít nhất 108^16 lần tạo và điều đó gần như không thể.
Các phần của access được tạo thế nào?
Để tạo ra một access token, EzyPlatform cũng áp dụng một số bước tương đối phức tạp.
Tạo phần header
Phần header bản chất userId hoặc adminId, tuy nhiên thông tin này khá quan trọng nên sẽ cần mã hoá hoá theo các bước sau:
- Chuyển đổi id thành dạng byte array.
- Sử dụng khoá bí mật của EzyPlatform để mã hoá.
- Chuyển các byte dữ liệu được mã hoá sang dạng base64 để nhìn được.
Việc mã hoá này cũng giúp access token trông "nguy hiểm hơn" vì được tăng độ dài và có một thứ gì đó bí mật.
Tạo phần body
Phần body được tạo qua các bước:
- Tạo ra một chuỗi ngẫu nhiên gồm: id + uuid + thời gian hiện tại.
- Sử dụng sha256 để hash và tạo ra một chuỗi có độ dài cố định.
Mã nguồn cho phần tạo access token sẽ như sau:
public static String generateAccessToken( String source, long sourceId, byte[] encryptionKey ) { if (encryptionKey == null) { throw new IllegalStateException("server's not ready yet"); } byte[] encryptedSourceIdBytes; try { byte[] sourceIdBytes = EzyBytes.getBytes(sourceId); encryptedSourceIdBytes = EzyAesCrypt .getDefault() .encrypt(sourceIdBytes, encryptionKey); } catch (Exception e) { throw new IllegalStateException( "can not generate access token for " + source + " id: " + sourceId, e ); } String header = EzyBase64.encode2utf(encryptedSourceIdBytes); String body = EzySHA256.cryptUtfToLowercase( String.valueOf(sourceId) + '-' + UUID.randomUUID() + '-' + System.currentTimeMillis() ); return header + body; }
Xác thực access token
Một access token sẽ trải qua các bước sau để được chấp nhận:
- Kiểm tra phần header bằng cách sử dụng khoá bí mật của EzyPlatform để giải mã xem có ra được adminId hoặc userId không, nếu không giải mã được thì không chấp nhận access token, ở bước này sẽ chưa truy cập cơ sở dữ liệu, đây cũng là một trong những ý nghĩa của việc mã hoá header.
- Truy cập vào cơ sở dữ liệu để xem có access token gửi đến được lưu lại không.
- Nếu có access token thì kiểm tra xem adminId hoặc userId trong cơ sở dữ liệu có khớp với id được giải mã ra không.
- Kiểm tra trạng thái của access token.
Mã nguồn giải mã id từ access token sẽ như sau:
public static long extractSourceId( String accessToken, byte[] encryptionKey ) { if (encryptionKey == null) { throw new IllegalStateException("server's not ready yet"); } try { String base64Header = accessToken.substring(0, 44); byte[] encryptedSourceIdBytes = EzyBase64.decode(base64Header); byte[] sourceIdBytes = EzyAesCrypt.getDefault() .decrypt( encryptedSourceIdBytes, encryptionKey ); return EzyLongs.bin2long(sourceIdBytes); } catch (Exception e) { return 0; } }
Tổng kết
Tạo ra và xác thực access token là một trong những tính năng cốt lõi của EzyPlatform, để bảo mật dữ liệu, ngăn chặn truy cập trái phép thông qua việc tấn công tạo ngẫu nhiên access token. Bạn có thể tham khảo lớp AccessTokens để tìm hiểu thêm về cách EzyPlatform tạo và giải mã access token.