跳到主要內容

文章

Node.js利用Crypto模組產生亂數字串

 兩階段驗證的流程中需要一個金鑰,測試時因為只有一名使用者,所以就自行指定亂數字串。 但是如果有多位使用者,自訂亂數字串就顯得不合時宜了。 在網路上找到crypto模組可以產生亂數,我的程式如下,記錄一下以方便未來直接引用 import crypto from 'crypto'; let buf = crypto.randomBytes(12); let buf_str = buf.toString('base64'); console.log(buf_str); randomBytes會傳回指定Bytes長度的亂數資料,其類型為 binary buffer 利用toString()並指定base64編碼轉成字串 這樣就可以很方便取得亂數字串了。 支援的編碼類型有:ascii, utf8, utf16le/ucs2, base64, binary,  hex

Node.js SyntaxError:Cannot use import statement outside a module

 今天在測試Node.js的功能時,使用import的語法,執行時出現錯誤:Cannot use import statement outside a module 出錯的程式片段如下: import express from 'express'; 如果修改程式如下,則執行成功: const express = require('express'); 原來在ES6標準釋出後,module成為標準,以export匯出介面,用import引入模組。 但是在之前採用的是的是CommonJS規範,以module.exports匯出介面,用require引入模組。 我的Node.js版本是v16.0.0,我的解決方式是修改package.json,增加語法 "type":"module"

Python TOTP、HOTP測試

 一開始接觸OTP是因為註冊一個雲端平台的測試帳號後,開啟兩階段認證的選項,進而產生興趣。 我們的VPN也有啟用兩階段的認證,當然它是商用版。網路上有一套FreeOTP的開源程式,有支援Android與IOS OTP(one-time password)稱為一次性密碼,又稱動態密碼或單次有效密碼,在一段有效期只能使用一次的密碼。 原本以為需要架設網路服務來產生密碼與認證,但是看了一下FreeOTP官網卻看不到有任何Server端的安裝文件。 原來OTP是不需要網路服務的,OTP用一組金鑰並搭配變數,例如時間,利用演算法讓伺服器端及用戶端可以產生一 樣的密碼,且這組密碼會隨時間變動失效。 目前常見的OTP密碼傳送方式有簡訊與手機APP,簡訊是由服務端(伺服器)產生密碼後,寄送到使用者的手機上, 而APP則是在用戶端(手機)自行產生密碼,再將密碼鍵入伺服器端來認證,這種方式完全不需要網路服務的。 我測試了兩種不同的技術:HOTP與TOTP,程式語言是python,不過網頁也有相關的模組,原理都是一樣的。 Event Base - OATH HOTP: HOTP 是HMAC-based One-Time Password的簡寫,雜湊函數加密的一次性密碼。 變動因子Counter 值(OTP 的產生次數)每個密碼僅在一次驗證中有效。 公式:OTPc = HOTP(Key,Counter) = Truncate(HMAC-SHA1(Key,Counter)) Time Base - OATH TOTP: TOTP 是Time-based One-Time Password的簡寫,表示基於時間戳算法的一次性密碼。 由於量以時間為變數因子,所以用戶端和伺服器時間必須保持一樣,否則會產生不一致的密碼。 公式:OTPt = HOTP(Key,Time) = Truncate(HMAC− SHA1(Key,Time)) 以下是我實測的過程與自己的一點小小心得,記錄下來。 首先安裝模組,我用的是pyotp pip install pyotp 金鑰是Base32格式,所以有下列兩種方式可以產生。 1、pyotp.random_base32() => 直接產生一組隨機的金鑰 2、(base64.b32encode(bytearray("abcd", 'asc

dialogflow fulfilment webhook傳json給LINE

 我在dialogflow已經設定好LINE,直接測試也是沒有問題。 但是在自己架設API Server後,卻一直無法正確將json傳給LINE。 最後發現需要設定text區段才能將json正確傳回給LINE。 我在dialogflow測試輸入,按下「DIAGNOSTIC INFO」按鈕, 在下圖中發現Raw API response沒有fulfillmentMessages, 但是fulfillment response卻有值,表示我的webhook是有被呼叫成功並回傳json給dialogflow 加上text區段後,可以在下圖中發現Raw API response有fulfillmentMessages的區段,這樣才是成功的。 也就是payload的區段中需要設定line與text,但是我測試的結果text的值LINE不會顯示 json = {     "fulfillmentMessages": [      {         "payload":{             "line": {                 "type": "sticker",                 "packageId": "11537",                 "stickerId": "52002734"             },             "text": { //text區段必須宣告                 "text": ["預設值" ]             }         }      }     ] } 更新:之後我又把text區段拿掉再測試一次,這次又可以了,所以目前我還是不知道是什麼原因。

Node.js Response 中文亂碼

 今天在測試node.js時,response出來的中文變成亂碼,在網路上找了一些文件及自己最後解決方式,記錄一下。 我的情形是這樣的,我在Windows上的docker有跑一個node.js,中文顯示是正常的;我在Cloud上跑的node.js,中文顯示是亂碼。但是程式碼內容是一樣的。 Cloud上安裝是Debian GNU/Linux 9 (stretch) 網路上有提到文件需要是utf-8的格式,所以我在Cloud上檢查我的app.js檔: # file -i app.js app.js: text/plain; charset=utf-8 文件是utf-8,內容也是utf-8,所以原則上應該是沒有問題的。 另一個需要注意的是header,所以我在app.js上加上下列: res.header("Content-Type", "application/json; charset=utf-8"); 但是response的中文還是亂碼,最後發現是我的ssh client的問題。 因為Cloud上沒有辦法輸入中文,所以我是先在Windows的vs code編輯好後再複製程式碼貼到Cloud上。 我使用的是xshell來連線Cloud,需要在「檔案」->「內容」,找到「終端機」的設定頁,將編碼改為UTF-8 這樣貼上程式碼時才會是UTF-8,重啟cloud上的node.js後中文就可以正常顯示了。

Raspberry Pi 開機自動執行python程式

 我有自行開發的一支網頁監控程式,需要在樹莓派上啟用python3的http服務。 參考網路上的作法在init.d設定新的daemon沒有成功,手動測試啟動時會出現下列錯誤: Failed to start prtg.service: Unit not found. Raspberry Pi的OS版本如下: pi@raspberrypi:~ $ cat /etc/os-release PRETTY_NAME="Raspbian GNU/Linux 10 (buster)" 經查詢之過才知道OS已將sysvinit改為systemd,依步驟設定好systemd之後終於可以開機自啟動。 1、在程式server_pi.py的第一行加入 #!/usr/bin/python3,並付予執行的權限 # sudo chmod +x server_pi.py 2、在/lib/systemd/system/新增檔案prtg,並將下列內容加入: [Unit] Description=Prtg Python Server [Service] Type=simple ExecStart=/home/pi/Desktop/prtg_monitor_fh/Server/app/server_pi.py Restart=always [Install] WantedBy=multi-user.target 3、設定開機時自動啟動 # sudo systemctl enable prtg 4、測試是否可以正確啟動 # sudo systemctl start prtg 5、可以查詢service的狀況 # sudo systemctl status prtg 6、重開樹莓派看看是否開機可以自動啟動

樹莓派Raspberry Pi關閉休眠、螢幕長亮

 記錄一下同事找到的作法,以備日後有需要時可以參考。 # cd /etc/lightdm # vi lightdm.conf 找到xserver-command並將註解拿掉,其值改為如下: xserver-command=X -s 0 -dpms 其中 -s # 設置螢幕保護不啟用 dpms 關閉電源節能管理 重開樹莓派即可。 還有另一種方式就是安裝 xscreensaver 套件 # sudo apt-get install xscreensaver 在X window的畫面左上點擊樹莓派icon > 偏好設定 > 螢幕保護程式 將 Mode 改為 Disable Screen Saver