Sfoglia il codice sorgente

读取 env 解密私钥

DevYK 3 anni fa
parent
commit
acda782535
12 ha cambiato i file con 167 aggiunte e 64 eliminazioni
  1. 2 0
      .env.example
  2. 13 2
      README.md
  3. 2 2
      app.js
  4. 25 6
      config/config.js
  5. 40 22
      model/moralis_sdk.js
  6. 2 0
      model/redis_db.js
  7. 45 23
      model/utils.js
  8. 8 0
      node_modules/.package-lock.json
  9. 14 0
      package-lock.json
  10. 1 0
      package.json
  11. 9 9
      routes/sdk.js
  12. 6 0
      routes/users.js

+ 2 - 0
.env.example

@@ -0,0 +1,2 @@
+NENET_CRYPT_KEY=
+NENET_CRYPT_IV=

+ 13 - 2
README.md

@@ -4,9 +4,15 @@ npm install
 ```
 
 配置环境变量
+
 ```
-export NENET_CRYPT_KEY=MOGsyhYeY5gWohJGLYyr3TDa7EsUqQ715WF5GPiK0TY=
-export =$PATH:$NENET_CRYPT_KEY
+vim ~/.bashrc
+
+export DENET_CRYPT_KEY=0IPmaec1o9FQCqGN
+export DENET_CRYPT_IV=Zh4A7bOY2ksp9oIn
+
+source ~/.bashrc
+
 ```
 
 启动
@@ -17,6 +23,11 @@ npm run dev
 npm run prd
 ```
 
+健康检查
+```
+http://localhost:3000/nenet
+```
+
 ## 文档
 - [token 技术文档](https://st94nif1cq.feishu.cn/docs/doccnNxG2UwHPCdZXbywgbdy13f)
 - [项目排期](https://st94nif1cq.feishu.cn/docs/doccntqBN5JHQriK7xz1SId3EC0)

+ 2 - 2
app.js

@@ -7,7 +7,7 @@ const bodyparser = require('koa-bodyparser')
 const logger = require('koa-logger')
 
 // const index = require('./routes/index')
-// const users = require('./routes/users')
+const users = require('./routes/users')
 var sdk = require('./routes/sdk');
 var db_test = require('./routes/db_test');
 // error handler
@@ -35,7 +35,7 @@ app.use(async (ctx, next) => {
 
 // routes
 // app.use(index.routes(), index.allowedMethods())
-// app.use(users.routes(), users.allowedMethods())
+app.use(users.routes(), users.allowedMethods())
 app.use(sdk.routes(), sdk.allowedMethods())
 app.use(db_test.routes(), db_test.allowedMethods())
 // error-handling

+ 25 - 6
config/config.js

@@ -1,6 +1,17 @@
 const build_config = {
     open_test: 1,
 }
+
+const cryppt_config = {
+    KEY: 'NENET_CRYPT_KEY',
+    KEY_IV: 'NENET_CRYPT_IV',
+}
+
+const reids_token_config = {
+    TOKENPRICE: 'TOKENPRICE',
+    TOKENWITHDRAW: 'TOKENWITHDRAW'
+}
+
 // 设置数据库配置文件
 const db_config = {
     test: {
@@ -12,12 +23,18 @@ const db_config = {
             PORT: '', //连接的端口
             HOST: '' //host
         },
+        // redis: {
+        //     PORT: 6379, // Redis port
+        //     HOST: "r-bp1ps6my7lzg8rdhwxpi.redis.rds.aliyuncs.com", // Redis host
+        //     USERNAME: "",
+        //     PASSWORD: "Wqsd@2019"
+        // },
 
         redis: {
             PORT: 6379, // Redis port
-            HOST: "r-bp1ps6my7lzg8rdhwx682.redis.rds.aliyuncs.com", // Redis host
-            USERNAME: "", 
-            PASSWORD: "Wqsd@2019"
+            HOST: "denet-test.y2slbl.clustercfg.memorydb.us-east-1.amazonaws.com", // Redis host
+            USERNAME: "", // needs Redis >= 6
+            PASSWORD: "",
         },
     },
 
@@ -33,9 +50,9 @@ const db_config = {
 
         redis: {
             PORT: 6379, // Redis port
-            HOST: "127.0.0.1", // Redis host
-            USERNAME: "default", // needs Redis >= 6
-            PASSWORD: "my-top-secret",
+            HOST: "denet-test.y2slbl.clustercfg.memorydb.us-east-1.amazonaws.com", // Redis host
+            USERNAME: "", // needs Redis >= 6
+            PASSWORD: "",
             db: 0, // Defaults to 0
         },
     },
@@ -95,5 +112,7 @@ module.exports = {
     token_price_config,
     token_balance_config,
     build_config,
+    cryppt_config,
+    reids_token_config,
 }
 

+ 40 - 22
model/moralis_sdk.js

@@ -3,6 +3,8 @@ const Moralis = require("moralis/node");
 
 var utils = require('./utils.js');
 var config = require('../config/config.js');
+const redis = require("../model/redis_db")  //导入 db.js
+
 /* Moralis init code */
 var serverUrl = config.moralis_config.test_server.SERVER_URL;
 var appId = config.moralis_config.test_server.APP_ID;
@@ -44,7 +46,7 @@ const transfer = async (obj) => {
     // initSDK(moralisSecret);
     console.debug("fun transfer start ok ");
     const opts = {};
-    opts.chainId = '0x61';
+    opts.chainId = 'bsc_testnet';
     opts.privateKey = config.moralis_config.test_server.DEFAULT_PRIVATE_KEY;
     opts.type = "erc20"; //native erc20
 
@@ -52,8 +54,9 @@ const transfer = async (obj) => {
         console.error("fun transfer parameter error.");
         return toJson(ERROR_CODE_001, null, "please check receiver or amount parameter is ok ?");
     }
-    if (obj.chainId != null) {
-        opts.chainId = obj.chainId;
+    if (obj.chain != null) {
+        opts.chainId = utils.getChainId(obj.chain);
+        console.log("chainId:", opts.chain);
     }
 
     if (obj.type != null) {
@@ -74,15 +77,15 @@ const transfer = async (obj) => {
     // opts.amount = Moralis.Units.Token(obj.amount, 18);
     opts.amount = obj.amount;
 
-    console.log("NENET_CRYPT_KEY", process.env.NENET_CRYPT_KEY);
+
 
     if (obj.privateKey != null) {
         opts.privateKey = obj.privateKey;
     }
 
     //解密私钥
-    var privateKey = utils.decryptPrivityKey(process.env.NENET_CRYPT_KEY, opts.privateKey);
-
+    // var privateKey = utils.decryptPrivityKey(process.env.NENET_CRYPT_KEY, opts.privateKey);
+    var privateKey = utils.decryptPrivityKey(opts.privateKey);
     if (privateKey == null) {
         return toJson(-1, null, "decryptPrivityKey error.");
     }
@@ -126,7 +129,7 @@ const transfer = async (obj) => {
 };
 
 const getAllTokenWithdrawInfoLists = async (obj) => {
-   await initMasterSDK();
+    await initMasterSDK();
     console.log('queryAllTokenBalance:', JSON.stringify(config.token_balance_config.TOKEN_BALANCE));
     return toJson(SUCCEED_CODE, JSON.stringify(config.token_balance_config.TOKEN_BALANCE), null);
 }
@@ -137,21 +140,36 @@ const getAllTokenWithdrawInfoLists = async (obj) => {
  */
 const getAllTotkenPrice = async (address, chain) => {
     await initMasterSDK();
-    const options = {
-        address: address,
-        chain: chain,
-    };
+    // const options = {
+    //     address: address,
+    //     chain: chain,
+    // };
+    // options.address = '0x7083609fCE4d1d8Dc0C979AAb8c869Ea2C873402'
+    // options.chain = 'bsc'
+    // for (let index = 0; index < 1000; index++) {
+    //  var ret = await Moralis.Web3API.token.getTokenPrice(options);
+    //     console.log("getTokenPrice=", index, ret);
+    // }
+    // if (1) return '';
+
     try {
-        console.debug("fun getTotkenPrice in ", options);
-        if (Array.isArray(config.token_price_config)) {
-            // const arrays = JSON.parse(config.token_price_config);
-            return toJson(SUCCEED_CODE, config.token_price_config, null);
-        }
-        // var ret = await Moralis.Web3API.token.getTokenPrice(options);
-        return toJson(ERROR_CODE_001, null, 'getTotkenPrice error.');
+        var token_price_key = config.reids_token_config.TOKENPRICE;
+        await redis.redis_get(token_price_key).then((result) => {
+            console.log("redis_get=", error, result); // Prints "value"
+            if (result)
+                return toJson(SUCCEED_CODE, config.token_price_config, null);
+            else return toJson(ERROR_CODE_001, null, error);
+        });
+        // // console.debug("fun getTotkenPrice in ", options);
+        // if (Array.isArray(config.token_price_config)) {
+        //     // const arrays = JSON.parse(config.token_price_config);
+        //     return toJson(SUCCEED_CODE, config.token_price_config, null);
+        // }
+        // // var ret = await Moralis.Web3API.token.getTokenPrice(options);
+        // return toJson(ERROR_CODE_001, null, 'getTotkenPrice error.');
     } catch (error) {
         console.error("getTotkenPrice=", error);
-        return toJson(ERROR_CODE_001, null, error);;
+        return toJson(ERROR_CODE_001, null, error.toString());;
     }
 }
 
@@ -162,11 +180,11 @@ async function getTokenTransfers(opt) {
     console.debug("fun getTokenTransfers in ", opt);
     const options = {};
     options.type = 'all';
-    options.chain = 'bsc';
-    //todo 对必填参数做检验
+    options.chain = 'bsc_mainnet';
 
     if (opt.chain != null) {
-        options.chain = opt.chain;
+        options.chain = utils.getChainName(opt.chain);
+        console.log('getTokenTransfers=', options.chain);
     }
 
     if (opt.order != null) {

+ 2 - 0
model/redis_db.js

@@ -20,8 +20,10 @@ var REDIS_INSTANCE = new Redis({
   host: host,
   username: username,
   password: password,
+  connectTimeout: 10000,
 });
 
+
 function redis_set(key, value) {
   REDIS_INSTANCE.set(key, value);
 }

+ 45 - 23
model/utils.js

@@ -1,7 +1,7 @@
 'use strict'
 var config = require('../config/config.js');
 var CryptoJS = require("crypto-js");
-
+require('dotenv').config()
 function toJson(code_, obj_, errMsg_) {
     var code = code_
     var data = obj_
@@ -15,31 +15,53 @@ function toJson(code_, obj_, errMsg_) {
  * @param {*} crypt_key 密文
  * @param {*} message 待解密的内容 U2FsdGVkX18zHfDE3lO2yVxk2lMCEiwjrzYo1ZbHqfriFapZWXqLhczs9J0cN9EnvQR64GLRzYDgzMuAr9U1C0LZjA5mV4cSAZeBOrY8KNY09+BhTDetb2/43bIwiFR6
  */
-function decryptPrivityKey(crypt_key, message) {
-    // var encrypt_pk = 'gAAAAABiYlOdvJbcNP8n3h0yT6QUTWLAOAHnL8cMRrU29PduZ5dh_aXC7YvKWwXTARN4YQBcVlnSX5oY-LcdGKWYn9yL0wD2KmnnTiLciYAyThdoMQIjcWcej8eNyFk3je0IUsXz6uQ11U5u6b9QltozL_bunKTdrT3g1i4_b9_dxU7cPlKPUIY='
-    // // Encrypt
-    // var ciphertext = CryptoJS.AES.encrypt(message, crypt_key).toString();
-    // // Decrypt
-    // var bytes = CryptoJS.AES.decrypt(message, crypt_key);
-    // var bytes2 = CryptoJS.AES.decrypt(encrypt_pk, crypt_key);
-    // var originalText = bytes.toString(CryptoJS.enc.Utf8);
-    // var originalText2 = bytes2.toString(CryptoJS.enc.Utf8);
-    // console.log("密文=", message);
-    // console.log("密钥=", crypt_key);
-    // console.log("解密后的明文=", originalText);
-    // console.log("直接解密后的明文=", originalText2);
-
-    // console.debug('decryptPrivityKey=', config.moralis_config.test_server.DEFAULT_PRIVATE_KEY);
-    // return config.moralis_config.test_server.DEFAULT_PRIVATE_KEY;
-    // return originalText
-
-    //通过密文 + 密钥解密得到私钥
-    var bytes = CryptoJS.AES.decrypt(message, crypt_key);
-    var originalText = bytes.toString(CryptoJS.enc.Utf8);
-    return originalText
+function decryptPrivityKey(message) {
+    console.log('message=', message);
+    console.log("NENET_CRYPT_KEY", process.env.NENET_CRYPT_KEY);
+    console.log("NENET_CRYPT_IV", process.env.NENET_CRYPT_IV);
+
+    // var encrypted = 'Zc4v3uJgPY+BVg/IrDLA4aIk9ko/UrgjAtBTLqymdMAvmqdp1GttRjkBgNNNTyxA+3ThbIGlM0INeeHGicYVbLea4ymkty8gd30rZXQ4yYQ='; //python is base64 ECB
+    // var key = '0IPmaec1o9FQCqGN'//key used in Python
+    // var iv = 'Zh4A7bOY2ksp9oIn'
+
+    var encrypted = message; //python is base64 ECB
+    var key = process.env.DENET_CRYPT_KEY//key used in Python
+    var iv = process.env.DENET_CRYPT_IV
+
+    console.log('decryptPrivityKey key= iv=', key, iv);
+
+    key = CryptoJS.enc.Utf8.parse(key);
+    // var decrypted =  CryptoJS.AES.decrypt(encrypted, key, {mode:CryptoJS.mode.ECB});
+    iv = CryptoJS.enc.Utf8.parse(iv)
+    var decrypted = CryptoJS.AES.decrypt(encrypted, key, { iv: iv, mode: CryptoJS.mode.CBC });
+    console.log('decrypted==', decrypted.toString(CryptoJS.enc.Utf8));
+    return decrypted.toString(CryptoJS.enc.Utf8)
+}
+
+
+const CHAIN_NAME = {
+    eth: 'eth',
+    bsc_testnet: 'bsc testnet',
+    bsc_mainnet: 'bsc'
+}
+
+const CHAIN_ID = {
+    eth: '0x1',
+    bsc_testnet: '0x61',
+    bsc_mainnet: '0x38'
+}
+
+function getChainName(key) {
+    return CHAIN_NAME[key];
+}
+
+function getChainId(key) {
+    return CHAIN_ID[key];
 }
 
 module.exports = {
     toJson,
     decryptPrivityKey,
+    getChainName,
+    getChainId,
 }

+ 8 - 0
node_modules/.package-lock.json

@@ -1889,6 +1889,14 @@
         "node": ">=4"
       }
     },
+    "node_modules/dotenv": {
+      "version": "16.0.0",
+      "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.0.0.tgz",
+      "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/duplexer3": {
       "version": "0.1.4",
       "resolved": "https://registry.npmmirror.com/duplexer3/-/duplexer3-0.1.4.tgz",

+ 14 - 0
package-lock.json

@@ -10,6 +10,7 @@
       "dependencies": {
         "crypto-js": "^4.1.1",
         "debug": "^4.1.1",
+        "dotenv": "^16.0.0",
         "fernet": "^0.4.0",
         "ioredis": "^5.0.4",
         "koa": "^2.7.0",
@@ -1917,6 +1918,14 @@
         "node": ">=4"
       }
     },
+    "node_modules/dotenv": {
+      "version": "16.0.0",
+      "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.0.0.tgz",
+      "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/duplexer3": {
       "version": "0.1.4",
       "resolved": "https://registry.npmmirror.com/duplexer3/-/duplexer3-0.1.4.tgz",
@@ -8017,6 +8026,11 @@
         "is-obj": "^1.0.0"
       }
     },
+    "dotenv": {
+      "version": "16.0.0",
+      "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.0.0.tgz",
+      "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q=="
+    },
     "duplexer3": {
       "version": "0.1.4",
       "resolved": "https://registry.npmmirror.com/duplexer3/-/duplexer3-0.1.4.tgz",

+ 1 - 0
package.json

@@ -11,6 +11,7 @@
   "dependencies": {
     "crypto-js": "^4.1.1",
     "debug": "^4.1.1",
+    "dotenv": "^16.0.0",
     "fernet": "^0.4.0",
     "ioredis": "^5.0.4",
     "koa": "^2.7.0",

+ 9 - 9
routes/sdk.js

@@ -12,14 +12,14 @@ async function getAllTotkenPrice(ctx) {
     console.log("body", typeof (ctx.request.body), ctx);
     const obj = ctx.request.body;
     console.log("obj", obj);
-    if (obj.address != null && obj.chain != null) {
-        await moralis.getTotkenPrice(obj.address, obj.chain).then((result) => {
-            console.log('getTotkenPrice result:', result)
-            ctx.body = result;
-        })
-    } else {
-        ctx.body = utils.toJson(-1, null, "please check address or chain parameter is ok ? ");
-    }
+    // if (obj.address != null && obj.chain != null) {
+    await moralis.getAllTotkenPrice(obj.address, obj.chain).then((result) => {
+        console.log('getTotkenPrice result:', result)
+        ctx.body = result;
+    })
+    // } else {
+    // ctx.body = utils.toJson(-1, null, "please check address or chain parameter is ok ? ");
+    // }
 }
 
 /**
@@ -83,7 +83,7 @@ async function crypto_test(ctx) {
     //process.env.NODE_ENV
     console.log("NDK_HOME", process.env.NDK_HOME);
 
-   var de_message =  utils.decryptPrivityKey(crypt_key,message);
+    var de_message = utils.decryptPrivityKey(crypt_key, message);
 
     console.log("decrypt message:", message);
 

+ 6 - 0
routes/users.js

@@ -0,0 +1,6 @@
+var router = require('koa-router')();
+router.prefix('/nenet');
+router.get('/', async (ctx)=>{
+    ctx.body = 'hell denet node server'
+})
+module.exports = router;