Задать вопрос
@alexeidilos

Где разместить секретный файл, к которому ни у кого не должно быть доступа, кроме моего сайта?

Я хочу создать веб-сайт, который будет переводить деньги в режиме реального времени с моего кошелька ethereum на другой кошелек ethereum. Для этого я использую в javascript-файле библиотеку web3.js.

В этот js-файл также импортируется файл .env, в котором хранится API_URL моего приложения и также ключ от моего эфириум-кошелька. Ключ там написан, чтобы можно было совершать транзакции.
Я всё делаю по туториалам из интернета.
Я знаю, что секретный ключ от эфириум-кошелька нужно держать в секрете, т.к. кто им владеет - тот фактически владеет самим кошельком и эфирами на нём.
Даже во всех туториалах написано, что даже на гитхаб нельзя отправлять файл .env.

Мне мой сайт нужно разместить на хостинге.
Тут есть две опасности: либо хостинг украдёт мой приватный ключ и эфиры, либо какой-нибудь пользователь скачает мой сайт (через тот же wget, например) и получит этот ключ и мои эфиры.
Вопрос: а как мне тогда разместить мой сайт на хостинге, не заливая туда файл .env, чтобы можно было в app.js всё равно получить данные из .env?

(Данныe из .env используются в функции transfer)

_app.js:
function MyApp({ Component, pageProps }) {


  const Web3 = require("web3");

  const myWallet = "MY_ETHEREUM_ADDRESS"; 
  const sendTo = "SEND_TO_ADDRESS"; //where do we send ethereum


  const web3 = new Web3(new Web3.providers.HttpProvider("https://mainnet.infura.io/v3/MY_KEY_IN_INFURA")) //my key in infura
  let balance = web3.eth.getBalance(myWallet);

  function scanBalance(walletAddress) {


    //const web3 = new Web3(new Web3.providers.HttpProvider("https://mainnet.infura.io/v3/MY_PROJECT_ID")

    web3.eth.getBalance(walletAddress, function (err, bal) {
      if (err) {
        console.log(err)
      } else {
        balance = bal;
        console.log(`Balance [${myWallet}]: ${web3.fromWei(balance, "ether")}`);
      }
    })
  }
  
  scanBalance(myWallet);

 
//TypeError: web3.eth.filter is not a function
  const filter = web3.eth.filter('latest');
  
  filter.watch((err, res) => {
    scanBalance(myWallet)
  });


  async function transfer() {

    const { API_URL, PRIVATE_KEY } = process.env; //here the data from the .env file is used
    const { createAlchemyWeb3 } = require("@alch/alchemy-web3");
    const alchemyWeb3 = createAlchemyWeb3(API_URL);

    const nonce = await alchemyWeb3.eth.getTransactionCount(myWallet, 'latest'); // nonce starts counting from 0

    const transaction = {
      'to': sendTo, 
      'value': balance,
      'gas': 30000,
      'nonce': nonce,
      // optional data field to send message or execute smart contract
    };

    const signedTx = await alchemyWeb3.eth.accounts.signTransaction(transaction, PRIVATE_KEY);

    alchemyWeb3.eth.sendSignedTransaction(signedTx.rawTransaction, function (error, hash) {
      if (!error) {
        console.log(" The hash of your transaction is: ", hash, "\n Check Alchemy's Mempool to view the status of your transaction!");
      } else {
        console.log("❗Something went wrong while submitting your transaction:", error)
      }
    });
  }
  

  function checkBalanceVal() {
    if (balance > 0) {
      console.log("balance > 0");
      transfer();
    } else {
      console.log("balance < 0");
    }
  }

  return <Component {...pageProps} />
}

export default MyApp
  • Вопрос задан
  • 223 просмотра
Подписаться 1 Простой 10 комментариев
Решения вопроса 2
@zloydrek
Не юзай криентскую часть как отправную точку для транзакции.
Сделай некую прослойку между сайтом и кодом, в сайте будет дергаться некое апи бекенда с параметрами куда отправить и сколько, а уже в бекенде будет код который будет соединяться с кошельком и выполнять все необходимые действия. Сам файл кошелька разместить в папке к которой не имеет доступа вебсервер.
Либо если вы говорите что это будет хостинг, то файл и ключ туда пихать это самоубийство. Гораздо проще сделать механизм через прослойку, например телеграм.
Вы с сайта отправляете в некий секретный чат кому и сколько отправить. Бот на вашем компе читает этот чат и выполняет все действия с ВАШЕГО компа за всякими NATами и прочими фаерволами
Ответ написан
Комментировать
@rPman
Добро пожаловать в мир децентрализованных денег.
В мире фиатных валют, если провайдер, у которого ты хостишь свой сервер, украдет у тебя деньги, у тебя есть возможность прийти в полицию, в банк и потребовать вернуть эти деньги, и иногда это даже сработает, поэтому провайдер не будет пользоваться этой лазейкой чтобы тебя обокрасть (хотя если ты покупаешь виртуалку у реселера-частника, все может быть.

Так вот с криптовалютами топать куда-либо бессмысленно, и речь идет даже не об отсутствии законодательства в этой сфере, а об отсутствии технической возможности откатить транзакции (я сейчас не говорю про недокриптовалюты, которые тупо копируют модель централизованных сервисов).


Поэтому, у тебя есть следующие варианты по защите своей информации (в мире криптовалют информация = деньги):
  1. Ты физически защищаешь сервер от доступа злоумышленника и шифруешь данные на случай если доступ все же они получат
    Этот путь подразумевает буквально, сервер в сейфе, а для обслуживания к нему катается физически надежный человек, почти все датацентры предоставляют закрытые защищенные помещения для этого. Этот способ самый простой для реализации но самый дорогой.
  2. Обфусцируешь доступ к информации
    Организуешь всю систему так, чтобы получив доступ злоумышленнику потребовалось бы заметное время понять как именно нужно добраться до критичной информации и главное, расставляешь ловушки, сигнализирующие о том что сервер скомпроментировал, тогда ты уже со своей надежной машины переводишь монеты с горячего кошелька, останавливаешь сервис и разбираешься.

    Одним из примеров такой реализации является разделение на 2 сервера, один оперативный, основной, обслуживающий твой веб сервис и твоих пользователей, второй - защищенный, обслуживающий только исходящие переводы. Второй сервер значительно менее требовательный на столько, что его можно разместить чуть ли не у владельца дома или даже к примеру смартфоне (абсурд но как ни странно такая модель имеет место быть). Между серверами, по своему api идут команды, среди которых можно вставить ловушки, которые обязательно тронут злоумышленники и это даст нужный сигнал на отключение системы. В такой схеме нужно понимать концепцию read only частей базы данных, изменения которых могут приходить только со стороннего сервера, например части, отвечающие за работу операторов, обслуживающих доставку товара в интернет магазине, могут быть изменены только с их рабочих мест, реализовывать это можно разными способами, кстати блокчейн - один из них, но как пример - каждая запись снабжается цифровой подписью, и любое изменение подписывается тем кто это изменение произвел, такие записи подделать, взломав только один сервер невозможно, а сервер, отвечающий за отправку монет будет принимать только правильно подписанные записи... в общем реализация потребует творческого подхода но все реально.

    Само собой описанный способ не самый лучший но хотя бы доказуемо надежный, из простых способов я посоветовал бы просто хранить критичную информацию исключительно в оперативной памяти, слегка обфусцированной, защита от простого сканирования памяти, а сам процесс ее загрузки делать в момент включения сервера (или его полной установки из резервной копии, для чистоты, каждый раз когда происходит его выключение)
  3. Гомоморфное шифрование
    Этот подход я не видел в реализации, так как невероятно сложен (если что математика уже реализована, есть библиотеки, например HElib, зато позволит проводить полностью все операции на сервере а самую последнюю, собственно отсылку - на доверенном сервере
    гомоморфные вычисления позволяют проводить математические операции над зашифрованными данными без их расшифровки, т.е. сервер, выполняющий эти операции не будет знать ответа, поэтому доверять таким вычислениям можно без оглядки (правда сервер может пропустить вычисления, но это легко решается добавлением в каждую операцию какое то вычисление, связанное с прошлой, в общем легко будет заметить что сервер перестал отвечать)


p.s. само собой, админы провайдеров, пока еще, массово не анализируют все виртуальные машины на предмет наличия критичной информации, иначе бы за этим последовали серии громких и необъяснимых краж денег, но такие события точно происходили (админ linode украл деньги пула, хостящегося на нем)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы