Skip to content
Đồ án cuối kì
Share
Explore

Đồ án giữa kì

Làm một ứng dụng web banking, có các tính năng giống timo.
Các chức năng coi
.
Đồ án giữa kì làm web api.
- Nhóm lẻ: RSA
- Nhóm chẵn: PGP

ĐAGK:
- Làm phần 3
- Thời gian: 3 tuần

ĐACK:
- Vấn đáp vào ngày thi
- Thang điểm trừ

Danh sách app

Có 3 phân hệ admin, giao dịch viên, người dùng, thêm hệ thống IAM để định dạng nữa là 4 app.

Liên kết giữa các ngân hàng

Giữa kì chỉ làm phần này thôi @@
DB set cứng.
Public API → Làm 2 API này thôi, data base set cứng. Vậy
phải làm cho xịn
. Up host heroku
Truy vấn thông tin tài khoản thuộc ngân hàng.
Nộp tiền vào một tài khoản thuộc ngân hàng.

Bảo mật
→ Xem Kĩ note ở dưới
Để đảm bảo tính bảo mật, các ngân hàng đều chọn một cơ chế mã hoá bất đối xứng cho các api của mình.
RSA
. Private key và public key có thể phát sinh ở
, hoặc google với từ khoá
rsa key generator
PGP. Private key và public key có thể phát sinh ở
, hoặc google với từ khoá
pgp key generator
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
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)

RSA gen signature and verify

const crypto = require('crypto'); // cua nodejs

let { publicKey, privateKey} = ...
// tạo chữ kí
const sign = crypto.createSign('SHA256');
sign.update(json data); // đưa data cần kí vào đây
const sig = sign.sign(privateKey, 'hex'); // tạo chữ kí bằng private key

// Verify thì làm gì
const verify = crypto.createVerify('SHA256');
verify.write(json data);
verify.end();
verify.verify(publicKey, sig, 'hex'); // truyen public key, chu ky vào để verify

PGP

const openpgp = require('openpgp');
(async () => {
const passphrase = `HAHAHA`; // what the private key is encrypted with

const {keys: [privateKey]} = await openpgp.key.readArmored(privateKeyPGP);
await privateKey.decrypt(passphrase);

const {data: cleartext} = await openpgp.sign({
message: openpgp.cleartext.fromText('Hello, World!'), // CleartextMessage or Message object
privateKeys: [privateKey] // for signing
});
console.log(cleartext); // '-----BEGIN PGP SIGNED MESSAGE ... END PGP SIGNATURE-----'

console.log('end cleartext')
const verified = await openpgp.verify({
message: await openpgp.cleartext.readArmored(cleartext), // parse armored message
publicKeys: (await openpgp.key.readArmored(publicKeyPGP)).keys // for verification
});
const {valid} = verified.signatures[0];
if (valid) {
console.log('signed by key id ' + verified.signatures[0].keyid.toHex());
} else {
throw new Error('signature could not be verified');
}
})();


DOCs


Want to print your doc?
This is not the way.
Try clicking the ⋯ next to your doc name or using a keyboard shortcut (
CtrlP
) instead.