آرتا رسانه

خطرات ذخیره داده های حساس در اتریوم

در این مقاله به ذخیره داده های حساس در اتریوم و خطرات آن می پردازیم. اتریوم برای اولین بار در اوایل سال 2015 معرفی شد و اکثر ما اکنون می دانیم که این یک شبکه بلاک چین عمومی است که در آن هر کسی با دسترسی به شبکه می تواند تراکنش های انجام شده توسط دیگران را مشاهده کند. به همین دلیل، ذخیره داده های حساس در اتریوم خطر قابل توجهی دارد.

برای آشنایی با آموزش برنامه نویسی بلاک چین پکیج آموزش برنامه نویسی بلاک چین را ملاحظه نمایید.

با این حال، چگونه داده های خصوصی در اتریوم عمومی می شوند؟ چگونه یک مهاجم می تواند اطلاعاتی را از تراکنش های اتریوم دریافت کند؟ محورهای اصلی این وبلاگ این موارد خواهد بود و نشان می دهد که چگونه یک مهاجم ممکن است به تراکنش های اتریوم برای استخراج داده های حساس نزدیک شود.

به مثال زیر توجه کنید: قطعه کد زیر از SWC Registry Unencrypted Private Data On-Chain گرفته شده است.

pragma solidity ^0.5.0; contract OddEven { struct Player { address addr; uint number; } Player[2] private players; uint count = 0; function play(uint number) public payable { require(msg.value == 1 ether, ‘msg.value must be 1 eth’); players[count] = Player(msg.sender, number); count++; if (count == 2) selectWinner(); } function selectWinner() private { uint n = players[0].number + players[1].number; (bool success, ) = players[n%2].addr.call.value(address(this).balance)(“”); require(success, ‘transfer failed’); delete players; count = 0; } }

در بالا قراردادی برای یک بازی حدس زدن وجود دارد. 2 کاربر می توانند هر کدام یک عدد را حدس بزنند و اگر مجموع آن اعداد به عدد زوج برسد، بازیکن اول برنده می شود در غیر این صورت بازیکن دوم برنده می شود. برای حضور در بازی و حدس زدن عدد، کاربر باید 1 ETH را به قرارداد انتقال/شرط کند و کاربر برنده کل مبلغ شرط را برای آن بازی دریافت کند.

در نگاه اول، قرارداد خوب به نظر می رسد، درست است؟ تابع () selectWinner و ساختار Player خصوصی اعلام می شوند و کاربران فقط می توانند تابع play (واحد) را فراخوانی کنند. در زیر تعاریف رسمی Solidity برای سطح دید خصوصی در توابع و متغیرهای حالت آمده است.

در صورت تمایل به آموزش برنامه نویسی سالیدیتی کلیک کنید.

توابع: توابع خصوصی مانند توابع داخلی هستند اما در قراردادهای مشتق شده قابل مشاهده نیستند.

متغیر حالت: متغیرهای حالت خصوصی مانند متغیرهای داخلی هستند اما در قراردادهای مشتق شده قابل مشاهده نیستند.

اکنون که منطق قرارداد را پوشش دادیم، بیایید به تراکنش های کاربر برویم، که برای آن می توانیم از Remix آنلاین IDE استفاده کنیم. کد قرارداد فوق را کپی پیست کنید تا قرارداد را مجدداً میکس کرده و اجرا کنید. اجازه دهید user1 کاربر عادی و user2 مهاجم باشد. مهاجم منتظر می ماند تا user1 ابتدا حرکت خود را انجام دهد. مهاجم در چنین سناریویی چه مزیتی دارد؟ برای درک این موضوع، فرض کنید user1 عددی را حدس زده و آن را به همراه 1 ETH از طریق تراکنش زیر در قرارداد هوشمند وارد کرده است.

استخراج داده های خصوصی از تراکنش کاربر

بیایید نگاهی دقیق‌تر به پارامتر ورودی (داده‌های تراکنش) در تراکنش فوق کاربر1 بیندازیم و ببینیم که چگونه یک مهاجم می‌تواند همین را معنا کند.

0x6898f82b0000000000000000000000000000000000000000000000000000000000000000000000000066
این مقدار هگز از دو بخش تشکیل شده است. چهار بایت اول (6898f82b) مشخص می کند که کدام تابع را فراخوانی کند. با استفاده از هش Keccak-256 نام تابع و آرگومان هایی که به عنوان امضای تابع شناخته می شود که play (uint256) است، تولید می شود. اگر هش Keccak-256 دارید، گاهی اوقات می‌توانید امضای تابع را با استفاده از پایگاه داده امضای اتریوم شناسایی کنید. برای تأیید اینکه 6898f82b هش بازی Keccak-256 (uint256) است، می توانید از هش آنلاین Keccak-256 استفاده کنید.

با شروع از بایت پنجم در مقدار هگز بالا، آرگومان های کدگذاری شده دنبال می شوند. یعنی هر چیزی که کاربر به عنوان آرگومان به تابع “play” ارسال کرده است. هر آرگومان با مقدار هگز ورودی به 32 بایت نشان داده می شود. در مورد ما، “0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066” است، زیرا مقدار هگز آن مربوط به ورودی user1 است که “102” بود.
اکنون، user2 که مهاجم است با ورودی user1 که 102 بود آشنا می شود. بنابراین، برای برنده شدن در بازی، مهاجم فقط باید عددی را وارد کند که مجموع ورودی user1 و ورودی user2 را به یک عدد فرد تبدیل کند. . بنابراین user2 (مهاجم) بازی حدس زدن را برنده می شود و کل مبلغ شرط را دریافت می کند.

پیشنهاد مطالعه: تراکنش های یک کیف پول در بلاکچین اتریوم با web3.js

اگر یک امضای عملکرد پیچیده باشد چه اتفاقی می افتد؟

یک امضای تابع پیچیده ممکن است شامل یک رشته ورودی با طول متغیر باشد که به تابع خاص فراخوانی شده و پارامترهای مورد نیاز و غیره بستگی دارد. هیچ مشکلی وجود ندارد، ما رابط باینری کاربردی (ABI) و Nodejs قرارداد را برای نجات داریم. ABI رابط استاندارد برای تعامل با قراردادها در اکوسیستم اتریوم، هم از خارج از بلاک چین و هم در میان قراردادها است. ABI را می توان در کاوشگرهایی مانند EtherScan پیدا کرد یا پس از کامپایل در Remix آنلاین IDE کپی کرد. در زیر ABI برای قرارداد بازی حدس زدن آمده است.

[ { "constant": false, "inputs": [ { "name": "number", "type": "uint256" } ], "name": "play", "outputs": [], "payable": true, "stateMutability": "payable", "type": "function" } ]

ABI فوق را در یک فایل abi.json ذخیره کنید. در مرحله بعد، ماژول “ethereum-input-data-decoder” را از طریق npm نصب کنید.

npm install ethereum-input-data-decoder

کد زیر را در یک فایل Nodejs ذخیره کنید. مطمئن شوید که مسیر صحیح فایل را به فایل abi.json ذکر کنید و داده های تراکنش مناسب را در کد وارد کنید.

const InputDataDecoder = require('ethereum-input-data-decoder'); const decoder = new InputDataDecoder(`${__dirname}/abi.json`); const data = `0x6898f82b0000000000000000000000000000000000000000000000000000000000000066`; const result = decoder.decodeData(data); console.log(result);

اسکریپت Nodejs فوق را برای مشاهده ورودی رمزگشایی شده کاربر و جزئیات عملکردی که توسط کاربر به شکل زیر فراخوانی شده است را اجرا کنید.

ذخیره داده های حساس در اتریوم

نتیجه

درست است که با EtherScan یا Remix، هر کسی ممکن است ورودی کاربر را در قالبی قابل خواندن توسط انسان از یک تراکنش اتریوم استخراج کند. با این حال، خواندن این مقاله به شما کمک می‌کند تا پیچیدگی‌های داده‌های تراکنش (txdata) را درک کنید، که یکی از خروجی‌های اولیه از ابزارهای خودکار متعددی است که در اتریوم برای اهداف مختلفی استفاده می‌شوند. و امیدوارم این مقاله تا حدودی خطر نگهداری داده های حساس در شبکه اتریوم را حتی در متغیر/عملکرد حالت خصوصی روشن کند. هر داده خصوصی باید یا خارج از زنجیره ذخیره شود یا به دقت رمزگذاری شود.

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

آرتا رسانه
آرتا رسانه
دیجیتال مارکتینگ چیست؟
Loading
/
پیمایش به بالا