Khi ngân hàng B muốn truy cập các api do ngân hàng A cung cấp, quá trình diễn ra như sau
A kiểm tra lời gọi api có phải xuất phát từ B (đã đăng ký liên kết từ trước) hay không:
A kiểm tra xem lời gọi này là mới hay là thông tin cũ đã quá hạn:
A kiểm tra xem gói tin B gửi qua là gói tin nguyên bản hay gói tin đã bị chỉnh sửa
Sử dụng kỹ thuật hash gói tin với secret key quy định trước
Nếu là yêu cầu liên quan đến tiền bạc (nạp tiền, trừ tiền), A thực hiện thêm công đoạn verify chữ ký bất đối xứng (RSA/PGP) mà B ký vào yêu cầu nạp/trừ tiền, nếu chữ ký hợp lệ, A mới thực hiện api. Response trả cho B cũng được A ký bất đối xứng tương ứng.
Chữ ký bất đối xứng là cơ sở để A và B thanh toán tiền bạc cho nhau (đối soát)
Nhắc nợ
Giả sử A mượn E 100k. A sợ E quên nên tạo nhắc nợ có tên E vào, 100k... Bên E sẽ nhận được notify (realtime?)
Giả sử E đã trả A tiền mặt rồi, thì E có thể xoá nhắc nợ đi. Khi xoá thì sẽ có một notify bên A( A sẽ thấy được tại sai E xoá nhắc nợ). Khi xoá nhắc nợ thì bên A có thể hiện thị là Xám cái nợ đó đi.
Note về phần Giữa kỳ
Tiêu chí đầu tiên: Chỉ cho người quen gọi
Dùng Token
Hoặc Mã hoá bất đối xứng cho các api
Hoặc kết hợp cả 2 cái trên
Note: Ích lợi của mã hoá bất đối xứng
Cho phép hệ thống kí vào gói tin gửi đi → Hệ thống đó không thể chối là mình đã từng gọi api đó. (cho phép ADMIN theo dõi các request với các ngân hàng khác)
Cho phép mã hoá và giải mã (A → B, chỉ có B mới biết cách giải mã, để xem có gì bên trong gói tin đó)
MÃ hoá bất đối xứng là: Nó sẽ tạo ra 2 khoá public key và private key, khoá private thì hệ thống nào tạo ra thì giữ trong nó luôn, chứ không có cho ai biết 😂😂😂. Khoá public là để chia sẽ,
a
Note phần xử lý khi B muốn gọi API của ngân hàng A.
A kiểm tra lời gọi API có phải của B (đã đăng kí liên kết trước) hay không.
Sao để kiểm tra??? 😨😱😱😱
Đơn giản nhất: thống nhất chung trong header gửi qua, là phải có một secure key nào đó. → thấy dùng cách 1 là ổn áp rồi 😂😂😂 tại vì chỉ mới bước verify phải B hay không nhưng đã tính toán nhiều quá thì mệt.
Hoặc: Sử dụng chữ kí, gói tin gửi qua phải có chữ kí của B. (private key để kí) và A dùng public key của B để verify chữ kí.
Cách hard core nhất: B mã hoá luôn data (json) bằng public key của A, rồi để bên A nó giải mã bằng private key.
2. A kiểm tra lời gọi này là mới hay thông tin cũ đã quá hạng - tránh việc hacker lắng nghe gói tin xong repeat lại.
Khi gửi B gửi kèm timestamp thời gian gửi. (limit là 60s nếu thời gian gửi trước đó 60s thì bỏ qua)
3. A kiểm tra xem đây là gói tin nguyên bản hay là đã bịchỉnh sửa???
Hash gói tin với secret key quy định trước. Nghĩa là trong gói tin B gửi qua, có hash body.json + timestamp
gói tin json + signature - hash(json + timestamp+ public private hay key gì đó nữa)
hash có thể hash md5 or sha256...
Gói tin có thể như này.
let obj = {
"id": 1,
"stk":"123357890"
}
let data = JSON.stringify(obj, null,2);
let ts = 1538978440;
let srKey = md5(ts + data); // md5(1538978440{\n\"id\":1,\n\"stk\":\"123357890\"\n})
// dcfa80f344139f463234c33e7ba070ec7
// sig cũng có thể hash thêm cái chuỗi nhận diện luôn
sau đó gửi res
{
"id": 1,
"stk":"123357890",
"ts": 1538978440,
"sig": "dcfa80f344139f463234c33e7ba070ec7"
}
// Khi bên A nhận sẽ bắt đầu kiểm tra là
lấy ts -> check xem có mới không
lấy sig, data, ts -> tạo lại một cái sig mới so sánh lại với cái sig nhận được, không khớp thì reject
Hoặc là để signature và nhãn thời gian lên header còn body cứ giữ nguyên (header gồm ts, signature, chuối nhận biến vd: IAMB)