Logo Zephyrnet

Cách chip NFC của thẻ thông minh cải thiện khả năng quản lý khóa an toàn trong các giải pháp chuỗi khối

Ngày:

hình ảnh

Ảnh đại diện Lisk Hacker Noon

@LiskLisk

Chúng tôi trao quyền cho các nhà phát triển với bộ công cụ phát triển phần mềm cho các ứng dụng blockchain được viết bằng JavaScript.

Một thách thức lớn trong nhiều giải pháp blockchain là kết nối an toàn các tác nhân hoặc đối tượng vật lý với biểu diễn kỹ thuật số của chúng trong blockchain. Một số ví dụ rõ ràng là chuỗi cung ứng và các giải pháp chống hàng giả, trong đó thông tin kỹ thuật số liên quan đến sản xuất, xuất xứ, chuỗi hành trình sản phẩm hoặc điều kiện vận chuyển được bảo mật bất biến trong chuỗi khối.

Trong hầu hết các giải pháp, các cặp khóa công khai / riêng tư đại diện cho các tác nhân kỹ thuật số và vật lý, máy móc hoặc hàng hóa được quản lý từ xa trong phần cuối của máy chủ từ xa hoặc đám mây. Vì quyền sở hữu, nhận dạng và sự tin tưởng vào các giải pháp blockchain được chuyển tải thông qua việc kiểm soát các khóa cá nhân, các hệ thống quản lý khóa từ xa đặt ra một vấn đề tốn kém và tốn nhiều công sức, và rất nghiêm túc rủi ro bảo mật lúc tồi tệ nhất. Như vậy, việc chuyển quy trình quản lý chủ chốt đến gần hơn với các đối tượng quan tâm không chỉ giúp tiết kiệm các nguồn lực quý giá; nó thêm một lớp đáng tin cậy cho giải pháp.

Trong bài viết này, chúng tôi mô tả cách sử dụng chip NFC của thẻ thông minh với dung lượng blockchain để quản lý khóa an toàn hơn trong các giải pháp blockchain và cụ thể là trong các giải pháp được xây dựng bằng Lisk SDK và JavaScript.

Đầu tiên, chúng tôi mô tả ngắn gọn công nghệ mà Gimly sử dụng cho mục đích này. Thứ hai, chúng tôi mô tả khái niệm bằng chứng về Giao thông thông minh được xây dựng bởi Marc Buma và Caspar Roelofs và được tài trợ thông qua chương trình Lisk Builders. Cuối cùng, chúng tôi đi sâu hơn một chút vào mã, để hiển thị chi tiết hơn cách các vi mạch tương tác với chuỗi khối Lisk trong cơ sở mã JavaScript của chúng tôi.

Tangem by Gimly: dành cho chip NFC blockchain

Gimly làm việc với tangem với tư cách là nhà cung cấp và đối tác triển khai, nhằm cung cấp một cách tiếp cận mới hướng tới việc quản lý an toàn hơn các cặp khóa công khai / riêng tư trong các giải pháp blockchain. Các chip thông minh NFC dành cho blockchain của Tangem được chứng nhận EAL6 +, có chứa yếu tố an toàn nơi các cặp khóa mới được tạo và từ đó khóa riêng không thể bị trích xuất, lộ hoặc sao chép.

Phần mềm cơ sở của chip cho phép sử dụng các khóa độc lập này để ký các giao dịch blockchain trực tiếp từ chip và ký, lưu trữ và trình bày dữ liệu được mã hóa bằng cách sử dụng bộ nhớ an toàn của nó. Hoạt động của chip được bảo vệ bằng các tùy chọn bảo mật khác nhau (bao gồm 2FA, mật mã và nhiều tùy chọn mã PIN), và phần sụn được kiểm toán độc lập bởi công ty bảo mật Kudelski.

Các chip có sẵn tại đây ở nhiều yếu tố hình thức khác nhau, bao gồm định dạng thẻ tín dụng vật lý bền, nhãn dán hoặc thẻ. Định dạng thẻ vật lý hiện có sẵn dưới dạng ghi chú tiền điện tử được cấp phép trước cho tất cả các loại tiền điện tử chính hoặc dưới dạng thẻ nhà phát triển có thể được cấp phép để hoạt động với bất kỳ chuỗi khối nào sử dụng đường cong mật mã secp256 hoặc ed25519, bao gồm cả Lisk.

hình ảnh
hình ảnh
hình ảnh
hình ảnh

Nhà xây dựng Lisk: PoC vận chuyển thông minh

Smart Transport PoC sử dụng thẻ thông minh Tangem để chứng minh cách một ví phần cứng có thể được sử dụng để bảo mật một gói bằng Lisk SDK. Trong phần trình diễn này, một ứng dụng khách mới đã được phát triển cho bản demo Lisk Transport sử dụng đầu đọc NFC để giao tiếp với thẻ thông minh Tangem.

hình ảnh

Trong bản demo, chúng tôi giả định rằng thẻ thông minh là một phần của một thùng chứa thông minh, tức là một thùng chứa được bảo mật bằng ví phần cứng của riêng nó, được sử dụng để ký tất cả các phép đo nhiệt độ và điều kiện cảnh báo mà thùng chứa báo cáo. Trong quá trình vận chuyển, tất cả các bên được kết nối với phương tiện vận chuyển, (khách hàng, nhà cung cấp và người nhận) có thể xác định khóa công khai cho container thông minh và do đó xác minh rằng dữ liệu nhận được thực sự bắt nguồn từ việc vận chuyển này.

Khi thùng chứa thông minh được chuẩn bị cho một phương tiện vận chuyển mới, một tài khoản mới sẽ được tạo trên thẻ thông minh dành riêng cho phương tiện vận chuyển này. Tài khoản này tự động được cấp vốn bằng một số LSK để có thể tự động gửi các giao dịch.

Trong khi quá trình vận chuyển đang diễn ra, tất cả các giao dịch bắt nguồn từ container thông minh (đo lường, báo động) đều được ký bởi tài khoản này, do đó chứng minh nguồn gốc và tính xác thực của chúng.

Khi quá trình vận chuyển kết thúc, LSK thặng dư từ tài khoản sẽ được trả lại và tài khoản sẽ bị xóa. Bây giờ container thông minh có thể được sử dụng cho một phương tiện vận chuyển mới.

Bản demo thêm các phần tử sau vào ví dụ Lisk Transport:

  • Trình điều khiển cho đầu đọc thẻ thông minh tương thích PC / SC. Trong phần trình diễn của chúng tôi, chúng tôi sử dụng đầu đọc ACS ACR1252. Trình điều khiển này được sử dụng để thăm dò ý kiến ​​của đầu đọc thẻ thông minh.
  • Trình điều khiển cho giao thức Tangem thực hiện tất cả các chức năng được yêu cầu để thực hiện các bước trên có thể thực hiện được (tạo ví, xóa ví, ký băm giao dịch bằng thẻ thông minh).
  • Thực hiện giao dịch tùy chỉnh đo lường đăng ký.
  • Một ứng dụng khách mới được sử dụng để bắt đầu và kết thúc quá trình vận chuyển và có thể được sử dụng để mô phỏng các phép đo.
  • Một ứng dụng IoT mới sử dụng đầu đọc thẻ thông minh để ký các phép đo nhiệt độ mô phỏng.
  • Trực quan hóa dữ liệu nhiệt độ được lưu trữ trên blockchain trong quá trình vận chuyển.

Thực hành với bản demo

Vì bản trình diễn này được xây dựng dựa trên hội thảo Lisk Transport, ít nhất bạn nên tiến hành bước 0 (Hội thảo Phần 0: Cài đặt và thiết lập) trước khi bắt đầu. Tại thời điểm này, bạn sẽ có một blockchain đang chạy với tất cả các điều kiện tiên quyết được cài đặt.

Ngoài ra, bạn nên đảm bảo rằng trình điều khiển PC / SC thích hợp cho đầu đọc NFC của bạn đã được cài đặt.

Bây giờ bạn có thể sao chép các nguồn của bản trình diễn vào một thư mục trên đĩa cứng của mình. Kho lưu trữ có thể được tìm thấy tại đây.

Gốc dự án cho các bước tiếp theo nằm trong gimly-vận chuyển thư mục.

Trình diễn sẽ sử dụng 3 cửa sổ đầu cuối:

Cửa sổ đầu tiên chạy blockchain

  • Điều hướng đến thư mục gốc của dự án
  • Cài đặt các phụ thuộc nút trong thư mục giao dịch
    Giao dịch ○ cd
    ○ npm cài đặt
  • Cài đặt các phụ thuộc nút trong thư mục tangem-smart
    ○ cd ../tangem-thông minh
    ○ npm cài đặt
  • Tiếp theo, điều hướng vào thư mục nút và khởi động chuỗi khối
    ○ cd ../nút
    ○ npm cài đặt
    ○ nút index.js | npx bunyan -o ngắn

Cửa sổ thứ hai chạy ứng dụng khách

  • điều hướng đến thư mục gốc của dự án
    ○ khách hàng cd
    ○ npm cài đặt
    ○ nút app.js

Cửa sổ thứ ba chạy ứng dụng IoT

  • điều hướng đến thư mục gốc của dự án
    ○ cd iot / nhiệt độ_and_humidity
    ○ npm cài đặt
    ○ nút index.js

Bây giờ bạn có thể kết nối với máy tính xách tay của mình để xem ứng dụng khách bằng cách mở http://localhost:3000 trong trình duyệt web của bạn.

Bước 1: Đặt thẻ thông minh trên đầu đọc NFC

hình ảnh

Chọn một trong các thẻ thông minh và đặt nó vào đầu đọc. Bây giờ nhấn refresh. Ứng dụng sẽ nhận dạng thẻ và cho phép bạn tạo một lô hàng mới. Nếu thẻ thông minh đã được sử dụng, nó sẽ hiển thị trạng thái của phương tiện vận chuyển hiện tại (bước 3, 4 hoặc 5, tùy thuộc vào tình trạng vận chuyển).

Bước 2: Tạo lô hàng

hình ảnh

Đầu tiên, hãy chọn một trong các tài khoản demo làm người gửi cho gói này. Đảm bảo rằng người gửi có đủ tiền, nếu không, việc tạo lô hàng sẽ không thành công (bạn có thể sử dụng nút chuyển tiền để nhận một số LSK từ vòi).

Tiếp theo, chọn người nhận và thiết lập các điều kiện vận chuyển (bưu phí và an ninh). Giữ mức độ tin cậy ở mức 0 cho lần vận chuyển đầu tiên của bạn. Khi bạn mô phỏng nhiều phương tiện vận chuyển hơn, mức độ tin cậy của nhà cung cấp dịch vụ được tuyển dụng sẽ tăng lên.

Cuối cùng, nhấn tạo để tạo lô hàng. Theo dõi cửa sổ đầu cuối cho khách hàng để xem điều gì đang xảy ra:

  • Đầu tiên, một tài khoản ví mới được tạo trên thẻ thông minh.
  • Tiếp theo, ví nhận được một số tiền từ vòi với một giao dịch chuyển khoản.
  • Cuối cùng, lô hàng mới được đăng ký trên blockchain với một giao dịch gói đăng ký.

Khi các thao tác này hoàn tất, trình duyệt sẽ thông báo cho bạn:

hình ảnh

Nhấn trở lại để trở về trang chính.

Bước 3: Bắt đầu vận chuyển

hình ảnh

Trước tiên, hãy đảm bảo rằng nhà cung cấp dịch vụ có đủ tiền để thanh toán bảo mật (bạn có thể sử dụng nút quỹ để nhận một số LSK từ vòi).

Tiếp theo, nhấn “bắt đầu vận chuyển”. Một giao dịch bắt đầu vận chuyển hiện được gửi đến blockchain. Khi giao dịch đã được gửi đi, trình duyệt sẽ thông báo cho bạn. Nhấn trở lại để quay lại trang chính.

Bước 4: Theo dõi quá trình vận chuyển và thêm các phép đo

hình ảnh

Trong khi quá trình vận chuyển đang diễn ra, quy trình IoT trong cửa sổ riêng biệt sẽ bắt đầu thêm các phép đo nhiệt độ mô phỏng vào lô hàng sau mỗi 15 giây. Nhìn vào đầu ra trong cửa sổ thiết bị đầu cuối IoT và cửa sổ blockchain để kiểm tra.

Trước khi thực hiện phép đo với blockchain, một hàm băm của bản ghi dữ liệu đo lường sẽ được tính toán và gửi đến thẻ thông minh. Thẻ thông minh sử dụng khóa riêng của nó để ký giao dịch. Tiếp theo, chữ ký được thêm vào giao dịch và giao dịch được cam kết với blockchain.

Khi bạn nhấn nút làm mới màu vàng trong cửa sổ trình duyệt, bạn có thể thấy các phép đo xuất hiện trong biểu đồ.

Bước 5: Kết thúc vận chuyển

hình ảnh

Cuối cùng, người nhận có thể chọn trạng thái kết thúc cho lô hàng và kết thúc quá trình vận chuyển.

Bước 6: Đặt lại vùng chứa thông minh

hình ảnh

Sau khi giao hàng xong, bạn có thể đặt lại gói thông minh. Giờ đây, số tiền còn lại trong tài khoản ví thông minh sẽ được gửi trở lại vòi và tài khoản sẽ bị xóa khỏi thẻ.

Bây giờ bạn có thể sử dụng lại thẻ cho chuyến hàng tiếp theo.

Tìm hiểu sâu về kỹ thuật: xem mã

Điểm khởi đầu

Dưới đây, mã chương trình từ ví dụ Lisk Transport ban đầu được hiển thị cho một giao dịch được xử lý bằng Lisk SDK. Nó là một phần của ứng dụng chạy trên mô-đun cảm biến. Sau khi phát hiện gói đã được mở, mô-đun cảm biến sẽ lưu trữ một giao dịch báo động mới trên blockchain.

api.accounts.get({ address: packetCredentials.address
}).then(response1 => { let tx = new LightAlarmTransaction({ asset: { timestamp: new Date().getTime() / 1000 }, fee: transactions.utils.convertLSKToBeddows('0.01'), nonce: response1.data[0].nonce }); tx.sign(networkIdentifier, packetCredentials.passphrase); api.transactions.broadcast(tx.toJSON()).then(res => { console.log("transaction submitted"); }).catch(err => { console.dir(err); });
});

Trong ví dụ mã này, một

LightAlarmTransaction

được tạo (# 27), được ký bằng phương pháp ký của giao dịch (# 35), và sau đó được phát tới mạng (# 37). Việc ký được thực hiện bằng cách sử dụng cụm mật khẩu được lưu trong bộ nhớ cục bộ.

Trong bản demo vận tải,

packetCredentials

tài khoản ký giao dịch được tạo bằng ứng dụng khách và sau đó được mã hóa cứng trong mã chương trình.

Trong phiên bản dự án của chúng tôi, quản lý thông tin xác thực được chuyển sang thẻ thông minh. Điều này làm cho việc quản lý khóa an toàn hơn và bổ sung thêm một cấp xuất xứ cho dữ liệu được cam kết với blockchain.

Vì thẻ thông minh là một thiết bị bên ngoài nên cần phải có một số phương tiện giao tiếp. Trong trường hợp này, tin nhắn tới thẻ được gửi bằng kết nối vô tuyến NFC. Trong bài đăng này, chúng tôi tập trung vào khía cạnh blockchain của mã, nhưng nếu bạn quan tâm đến hoạt động bên trong của giao tiếp NFC bằng đầu đọc thẻ USB NFC và việc triển khai các phương thức bắt buộc của giao thức tangem, bạn có thể tìm thấy chúng trong NS thư mục con tangem-smart. Trong mô-đun tangemcard.js, ba phương pháp quan trọng đã được triển khai:

  • createWallet

    : phương pháp này tạo một tài khoản ví chung mới trên thẻ thông minh. Khóa công khai từ tài khoản này được sử dụng để tạo địa chỉ trên sidechain vận tải Lisk.

  • signData

    : phương pháp này được sử dụng để ký một mã băm hoặc để băm và ký một gói dữ liệu nhị phân bằng cách sử dụng khóa cá nhân được lưu trữ trên thẻ thông minh.

  • purgeWallet

    : phương pháp này sẽ xóa vĩnh viễn tài khoản ví được lưu trữ trên thẻ thông minh.

Tạo ví trên thẻ thông minh

Trước khi thẻ thông minh có thể được sử dụng để ký giao dịch, một ví mới cần được tạo trên thẻ thông minh và một số tiền cần được gửi đến ví này. Khi điều này được thực hiện, địa chỉ ví cần được đăng ký làm tài khoản gói hợp lệ trên blockchain.

Quá trình bắt đầu (xem Bước 2: Tạo lô hàng ở trên) khi người dùng đặt một thẻ thông minh trống (tức là thẻ thông minh không có ví) gần đầu đọc NFC, nó điền vào các điều kiện vận chuyển và nhấn nút tạo. Điều này gây ra một lệnh gọi hàm trên

handlerRegisterSmartPackage

hàm số. Mã cho chức năng này được tìm thấy trong tệp handlers.js trong thư mục máy khách.


const handlerRegisterSmartPackage = (app, api) => async (req, res) => { // save current values app.locals.formdata.passphrasesender = req.body.passphrasesender; app.locals.formdata.passphraserecipient = req.body.passphraserecipient; app.locals.formdata.postage = req.body.postage; app.locals.formdata.security = req.body.security; app.locals.formdata.minTrust = req.body.minTrust; if(req.body.submit==='Fund Sender with 100 LSK') { // fund button pressed let participantAddress = getAddressForPassphrase(app.locals.formdata.passphrasesender); let success = await fundAddress(api, participantAddress, "100"); if(success) { doInfoMessage(res, `Fund sender ${participantAddress} with 100 LSK success`) } else { doErrorMessage(res, `Fund sender ${participantAddress} with 100 LSK failed`); } } else if(req.body.submit==='Fund carrier with 1500 LSK') { // fund button pressed let participantAddress = getAddressForPassphrase(app.locals.formdata.passphrasecarrier); let success = await fundAddress(api, participantAddress, "100"); if(success) { doInfoMessage(res, `Fund carrier ${participantAddress} with 100 LSK success`) } else { doErrorMessage(res, `Fund carrier ${participantAddress} with 100 LSK failed`); } } else { try { // // step 1 -> make sure that the card has no wallet if(haveCard && currentPacketId !== false) { doErrorMessage(res, "This card already has an address, finish the transport before using it again"); } const passphrasesender = app.locals.formdata.passphrasesender; const passphraserecipient = app.locals.formdata.passphraserecipient; const postage = app.locals.formdata.postage; const security = app.locals.formdata.security; const minTrust = app.locals.formdata.minTrust; let result1 = await createWalletUsingActiveCard() if(false===result1) { doErrorMessage(res, "Unable to create wallet on this card"); } let maxwait = 15; // max waittime in seconds do { if(currentPacketId===false) { await sleep(1000); maxwait--; } else { break; } } while(maxwait>0); console.log("got packetId %s", currentPacketId) let result = await fundAddress(api, currentPacketId, "100"); // enough for 1000 measurements @ 0.1 lsk each if(false===result) { doErrorMessage(res, `Funding failed for ${currentPacketId}, finish the transport before using it again`); } maxwait = 30; // max waittime in seconds do { let packetaccount = await getAccount(api, currentPacketId); if(false===packetaccount) { await sleep(1000); maxwait--; } else { break; } } while(maxwait>0); if(false===result) { doErrorMessage(res, "Timeout while waiting for completion of fund transaction"); } try { console.log("got senderpassphrase %s", passphrasesender) let senderAddress = getAddressForPassphrase(passphrasesender); const registerPackageTransaction = new RegisterPacketTransaction({ asset: { security: transactions.utils.convertLSKToBeddows(security), minTrust: Number(minTrust), postage: transactions.utils.convertLSKToBeddows(postage), packetId: currentPacketId, recipientId: getAddressForPassphrase(passphraserecipient), }, fee: transactions.utils.convertLSKToBeddows('0.1'), nonce: await getNonceForAddress(api, senderAddress) }); console.log("got transaction %o", registerPackageTransaction) registerPackageTransaction.sign(networkIdentifier,passphrasesender); let registerresult = await api.transactions.broadcast(registerPackageTransaction.toJSON()); doInfoMessage(res, 'package registration complete'); } catch(ex) { doErrorMessage(res, "Packet registration failed: " + JSON.stringify(ex.message, null, 2)); } } catch(ex) { doErrorMessage(res, "Packet registration failed: " + JSON.stringify(ex.message, null, 2)); } }
}

Quá trình bắt đầu ở dòng # 40. Một cuộc gọi đến

createWalletUsingActiveCard 

khởi tạo ví mới trên thẻ thông minh. Một vòng lặp chờ trên dòng # 45 là bắt buộc vì phải mất một lúc để ứng dụng phát hiện ví mới: biến

currentPacketID

nhận địa chỉ ví.

Một đoạn mã thú vị liên quan đến điều này có thể được nhìn thấy trong tệp handlers.js trong thư mục máy khách.

checkReader = () => { try { let reader = getReader(); if(false!==reader) { let activeCardData = getActivecardData() haveCard = true; currentPacketPublicKey = false; currentPacketId = false; if(activeCardData && "WalletPublicKey" in activeCardData) { currentPacketPublicKey = activeCardData.WalletPublicKey.toString('hex'); currentPacketId = cryptography.getAddressFromPublicKey(activeCardData.WalletPublicKey) } } else { haveCard = false; }; // console.log("hc %s / cpid %s", haveCard, currentPacketId); } catch(ex) { console.error("app.checkReader - error ", ex.message) } finally { setTimeout(checkReader, 1000); }
}

T

checkReader

hàm được gọi định kỳ trong nền bằng cách sử dụng setTimeout. Trong chức năng này, đầu đọc thẻ NFC được thăm dò (dòng số 5) và

activeCardData

được truy xuất. Nếu ví có trên thẻ, khóa công khai của ví chung sẽ được chuyển đổi thành địa chỉ blockchain bằng cách sử dụng

getAddressFromPublicKey

chức năng từ thư viện mật mã Lisk SDK.

Quá trình trong

handlerRegisterSmartPackage

chức năng bây giờ tiếp tục ở dòng # 55 nơi một số tiền được gửi vào thẻ. Các khoản tiền này là bắt buộc khi gửi các giao dịch có chữ ký của ví trên thẻ lên blockchain.

Một lần nữa, một vòng lặp chờ được nhập (dòng # 61) sẽ tạm dừng cho đến khi tài khoản được liên kết với ví smartcard được định vị trên blockchain.

// client/functions.js #49 const getAccount = async (api, address) => { try { let accounts = await api.accounts.get({address}) if(accounts.data.length>0) { return accounts.data[0] } else return false; } catch(ex) { return false; }
}

Sản phẩm

getAccount

function (từ functions.js # 49) thực hiện điều này bằng một lệnh gọi tới Lisk SDK (dòng # 5).

Cuối cùng, ở dòng # 76 trong

handlerRegisterSmartPackage

hàm, registerPackageTransaction được khởi tạo và ký bởi người gửi gói (dòng # 93).

Sau khi phát sóng giao dịch này đến mạng blockchain, đăng ký gói hoàn tất và chức năng tồn tại. Sau khi giao dịch được cam kết với blockchain, tài khoản gói hợp lệ với số tiền ban đầu hiện đã tồn tại trên thẻ thông minh.

Ký dữ liệu đo lường

Sau khi bắt đầu vận chuyển (không được mô tả ở đây), cảm biến bắt đầu thu thập dữ liệu và cam kết dữ liệu này vào chuỗi khối bằng cách sử dụng

register-measurement

giao dịch tùy chỉnh trên sidechain. Để chứng minh nguồn gốc của dữ liệu, mỗi gói dữ liệu đo lường được ký bằng ví trên thẻ thông minh.

Phần quan trọng của

register-measurement

giao dịch tùy chỉnh được hiển thị bên dưới:

// transactions/register-measurement.js #27 applyAsset(store) { const errors = []; const packet = store.account.get(this.senderId); if (packet === undefined) { errors.push(new TransactionError("packet not found", this.id, "this.asset.id", this.asset.id, "An existing packet ID on recipient account")); } if(packet.status==='ongoing'||packet.status==='alarm') { let timestamp = dateToLiskEpochTimestamp(new Date()); if(false === "asset" in packet) { packet.asset = {} }; if(false === "measurements" in packet.asset) { packet.asset.measurements = [] }; packet.asset.transportstatus = 'active'; packet.asset.measurements.push({ timestamp: this.asset.timestamp, temperature: this.asset.temperature, humidity: this.asset.humidity }); store.account.set(packet.address, packet); } return errors; }

Trong khi quá trình vận chuyển đang diễn ra (dòng # 10) các phép đo mới (mô phỏng) được lưu trữ trong mảng các phép đo trong cấu trúc tài sản của gói tin (dòng # 15). Ứng dụng khách hiển thị các phép đo này dưới dạng biểu đồ trên trang gói thông minh, (xem ở trên tại Bước 4: Theo dõi quá trình vận chuyển và thêm các phép đo).

Trình diễn về việc sử dụng giao dịch này được tìm thấy trong ứng dụng Temperature_and_humidity. Đây là mã chạy bên trong mô-đun cảm biến và được gọi định kỳ để đo các điều kiện vận chuyển. Trong trường hợp này, để có thể chứng minh nguyên tắc mà không cần phần cứng thực tế, các phép đo được mô phỏng. Điều này có thể được nhìn thấy ở đây dưới đây:

// iot/temperature_and_humidity.js #30 const doMeasurements = async () => { let goFast = true; try { console.log("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++") let reader = getReader(); if(reader) { await rescanActiveCard(); let activeCardData = getActivecardData() if(false===activeCardData) { console.log("no card in reader"); return; } if(undefined === activeCardData.WalletPublicKey) { console.log("not a valid smart package"); return; } let packetPublicKey = activeCardData.WalletPublicKey.toString('hex'); let packetID = cryptography.getAddressFromPublicKey(activeCardData.WalletPublicKey) let packetAccount = await getAccount(packetID); goFast = true; if(false===packetAccount) { console.log("packet with Id %s has not yet been registered", packetID); return; } else if ( packetAccount.asset.status !== 'ongoing'){ console.log("packet with Id %s - transport not active (status: %s)", packetID, packetAccount.asset.status); return; } else { // console.log("packet data: %o", packetAccount.asset); goFast = false; } // simulate gradual changes in temperature and humidity gSensorState.temperature += (gSensorState.temperatureUp ? 1 : -1) * Math.random(); if(gSensorState.temperature>30) { gSensorState.temperatureUp = false } else if(gSensorState.temperature<5) { gSensorState.temperatureUp = true } gSensorState.humidity += (gSensorState.humidityUp ? 1 : -1) * Math.random(); if(gSensorState.humidity>70) { gSensorState.humidityUp = false } else if(gSensorState.humidity<40) { gSensorState.humidityUp = true } let measurement = { timestamp: new Date().getTime() / 1000, temperature: Math.round(gSensorState.temperature*100)/100, humidity: Math.round(gSensorState.humidity*100)/100 }; // create measurement transaction let tx = new RegisterMeasurementTransaction({ networkIdentifier, senderPublicKey: packetPublicKey, asset: measurement, fee: transactions.utils.convertLSKToBeddows('0.01'), nonce: packetAccount.nonce }); // console.log("got transaction %o", tx) // console.log(tx.getBytes().toString('hex')); // sign transaction using on-card wallet const transactionWithNetworkIdentifierBytes = Buffer.concat([ cryptography.hexToBuffer(networkIdentifier), tx.getBytes() ]); // sign hash of data with the card const datatosign = cryptography.hash(transactionWithNetworkIdentifierBytes) console.log("got data to sign (%s bytes) %s", datatosign.length, datatosign.toString('hex')) tx.signatures = [await signDataUsingActiveCard(datatosign, false)]; if(false!==tx.signatures[0]) { console.log("sending transaction") // debug code: use verify function to check signature // console.log(tx.validate()); tx._id = transactions.utils.getId(tx.getBytes()); try { let res = await api.transactions.broadcast(tx.toJSON()); console.log("++++++++++++++++ API Response +++++++++++++++++"); console.log(res.data); console.log("++++++++++++++++ Transaction Payload +++++++++++++++++"); console.log(tx.stringify()); console.log("++++++++++++++++ End Script +++++++++++++++++"); } catch(ex) { console.error("broadcast transaction error %s", ex.errno) } } else { console.error("signing with card failed"); } } else { console.log('no active wallet') } } catch(ex) { console.error("doMeasurements error - %s", ex.message); } finally { setTimeout(doMeasurements, goFast? 1000: 15000); }
}

Như đã minh họa ở trên, dữ liệu thẻ thông minh đang hoạt động được truy xuất tại dòng # 21. Dữ liệu nhiệt độ được tạo ở dòng # 38 và được lưu trữ trong hồ sơ đo tại dòng # 52. Tiếp theo, một

RegisterMeasurementTransaction

được khởi tạo.

Bây giờ mọi thứ bắt đầu hoạt động khác khi so sánh với việc sử dụng tài khoản ví cục bộ.

Tại dòng # 71, giao dịch được chuyển đổi thành một mảng byte và một tiền tố bao gồm số nhận dạng mạng được thêm vào. Hàm băm của mảng byte này được tính ở dòng # 77 (sử dụng hàm băm từ thư viện mật mã trong Lisk SDK).

Hàm băm này được gửi đến thẻ thông minh để ký bằng cách sử dụng

signDataUsingActiveCard

hàm số. Chữ ký trả về được thêm vào giao dịch (dòng # 79).

Cuối cùng, một id cho giao dịch được tính toán (dòng # 85) và giao dịch được phát tới mạng blockchain (dòng # 87).

Xóa ví trên thẻ thông minh

Sau khi quá trình vận chuyển hoàn tất, ví trên thẻ thông minh có thể bị xóa để thẻ có thể được sử dụng cho một phương tiện vận chuyển mới. Điều này được thực hiện với một cuộc gọi đến

purgeWallet

chức năng trong

tangemcard

thư viện như mô tả bên dưới. Chức năng này cung cấp một minh họa tốt về cách thức hoạt động của giao tiếp với thẻ thông minh:

# tangem-smart/tangemcard.js exports.purgeWallet = async ( reader, cid = 'BB03000000000004', pin1 = '000000', pin2 = '000',
) => { try { const pin1Hex = crypto .createHash('sha256') .update(Buffer.from(pin1)) .digest('hex'); const pin2Hex = crypto .createHash('sha256') .update(Buffer.from(pin2)) .digest('hex'); let tlv; let tlv1 = Buffer.from('0108' + cid, 'hex'); let tlv2 = Buffer.from('1020' + pin1Hex, 'hex'); let tlv3 = Buffer.from('1120' + pin2Hex, 'hex'); tlv = Buffer.concat([tlv1, tlv2, tlv3]); let base = Buffer.from([ 0x00, // Class 0xFC, // INS: Purge wallet command 0x00, // P1: 0x00, // P2 tlv.length, // Le: Full Length of UID ]); let request = Buffer.concat([base, tlv]); let response = await reader.transmit(request, 8192); // console.log("response %s", response.toString('hex')); let sw1 = response[response.length - 2] let sw2 = response[response.length - 1] let sw = 256 * sw1 + sw2; if(sw===0x9000) { // console.log("purgeWallet OK (%s)", sw.toString(16)) return decodeTLV(response); } else { console.error("purgeWallet ERROR (card response %s)", sw.toString(16)) return false; } return response; } catch(ex) { console.error("purgeWallet ERROR %s", ex.message) return false; }
};

Tại dòng # 35, một yêu cầu được truyền đến đầu đọc thẻ thông minh. Yêu cầu này là một mảng byte được tạo bằng cách kết hợp một số cấu trúc dữ liệu (dòng # 24 và dòng # 34) chẳng hạn như id thẻ (dòng # 21), hai mã pin băm (dòng # 22, 23) và lệnh dữ liệu (# 26). Sau khi lệnh được thẻ xử lý, cấu trúc dữ liệu trả về (phản hồi, dòng # 35) được giải mã để xác định xem yêu cầu đã được xử lý thành công hay chưa.

Trong trường hợp này, mã lệnh 0xFC (dòng # 28) cho thẻ thông minh biết rằng lệnh thanh lọc ví được yêu cầu.

Nhà xây dựng Lisk

dự án được khởi xướng bởi Caspar Roelofs người đã bảo đảm một khoản trợ cấp của Lisk Builders để cho phép sử dụng chip thẻ thông minh để quản lý khóa cá nhân trong các giải pháp blockchain Lisk. Là người sáng lập của Dự án Blockchain Gimly, anh ấy giúp khách hàng tận dụng blockchain, IoT và các công nghệ mới khác cho nhu cầu kinh doanh của họ.

Gimly tin rằng sự đổi mới có ý nghĩa đạt được thông qua sự hiệp lực và tối đa hóa sự hợp tác để xây dựng dựa trên thế mạnh của khách hàng, đối tác và cộng đồng. Dịch vụ tư vấn và phát triển bao gồm phát triển sản phẩm đầu cuối, kiến ​​trúc giải pháp, công nghệ, nghiên cứu sản phẩm và thị trường, quản lý sản phẩm và phát triển kinh doanh.

Marc Buma đã tham gia dự án với tư cách là nhà phát triển chính, với chuyên môn của mình về phát triển IoT, blockchain và JavaScript. Marc bắt đầu sự nghiệp của mình với tư cách là một kỹ sư R & D tại Noldus Information Technology và làm việc trong việc phát triển các hệ thống đo lường hành vi tự động và đã tự kinh doanh, (Tên công ty Bumos) từ năm 2004. Anh ấy đã làm việc trong các dự án đổi mới phát sóng với Jetix, Disney, MTV, KPN và Viện Âm thanh và Tầm nhìn Hà Lan, và có nền tảng vững chắc trong việc phát triển các hệ thống sức mạnh công nghiệp.

Hiện tại, anh ấy đang phát triển và duy trì các sản phẩm đặt riêng cho khách sạn trên du thuyền sang trọng, hệ thống theo dõi hậu cần phi tập trung dựa trên blockchain trong ngành thời trang và các chuyến tham quan có hướng dẫn VR. Marc đang hoạt động với tư cách là cố vấn / cố vấn kỹ thuật cho một số công ty khởi nghiệp và dự án trong lĩnh vực blockchain và hậu cần. Anh cũng là một nhiếp ảnh gia chuyên chụp ảnh toàn cảnh với niềm đam mê bảo tồn di sản văn hóa và là tác giả của một cuốn sách hướng dẫn du lịch ảo.

Làm việc với Tangem của Gimly

Nếu bạn muốn sử dụng công nghệ này trong các dự án của riêng mình, hãy truy cập gimly.io để tìm hiểu cách lấy bộ dùng thử hoặc hỏi về kinh doanh đến các lựa chọn kinh doanh nếu bạn đang tìm kiếm khối lượng thẻ, nhãn dán hoặc thẻ tùy chỉnh cao hơn với thiết kế và ví tùy chỉnh cho tiền điện tử của mình.

Tuyên bố từ chối trách nhiệm: Bài đăng trên blog này được viết bởi các thành viên cộng đồng của chúng tôi, Caspar Roelofs (Hồ sơ LinkedIn) và Marc Buma (Hồ sơ LinkedIn) như một phần của việc họ tham gia vào chương trình Lisk Builders.

by Lisk @Lisk. Chúng tôi trao quyền cho các nhà phát triển với bộ công cụ phát triển phần mềm cho các ứng dụng blockchain được viết bằng JavaScript.Ghé thăm chúng tôi

Tag

Tham gia Hacker Noon

Tạo tài khoản miễn phí của bạn để mở khóa trải nghiệm đọc tùy chỉnh của bạn.

PlatoAi. Web3 được mô phỏng lại. Khuếch đại dữ liệu thông minh.
Nhấn vào đây để truy cập.

Nguồn: https://hackernoon.com/how-smart-card-nfc-chips-improve-secure-key-management-in-blockchain-solutions-912×3722?source=rss

tại chỗ_img

Tin tức mới nhất

tại chỗ_img