[投票專題 Overview](https://hackmd.io/@zRWCfXc1TOaCsnINOAPeCw/HkkDB4G12)
[投票專題 111上學期](https://hackmd.io/@zRWCfXc1TOaCsnINOAPeCw/not6914)
[投票專題 111下學期](https://hackmd.io/@zRWCfXc1TOaCsnINOAPeCw/HJH2t28ho)
[投票專題 112暑假](https://hackmd.io/@zRWCfXc1TOaCsnINOAPeCw/Hkv1faxuh)
[系統整合實作的 Github organization](https://github.com/System-Integration-Implementation)
[暫時使用google cloud來部屬](https://console.cloud.google.com/home/dashboard?hl=zh-tw&project=go-fido)
---
# 0922 Update
## Outline
### 前端
前端合併成功,register、login都可以正常運作
待修的bugs:
1. 按下register或是sign後,會先跳到Home才要求按壓指紋。
小發現:點擊手機底下的返回鍵或是下拉通知選單都會讓按壓指紋的提示不見。
預期:在登入頁面進行指紋辨識,通過才可以跳轉到Home
2. 目前的challenge(FIDO驗證所需的challenge/response)是直接寫死在程式中,未來要接到server並從server隨機產生challenge送過來。
4. 在投票結束後顯示的比例長條圖,不知為何長條的左右兩端從圓滑的半圓變成直角。

預期:圓滑的半圓
4. 刪除project中沒被使用到的code
前端先不要接到http那邊 我們後端比較慢 你們可能沒辦法測試
### 後端(部屬assetlinks & 建DB & python架構)
assetlinks部屬 [網址](https://sdfgsj.github.io/.well-known/assetlinks.json)

建DB:username uid email pubkey(RSA256)
gcloud sql connect fido-db --user=postgres --quiet
```code=
create table userinfoVER1(
email varchar(100),
name varchar(40),
uid integer PRIMARY KEY
);
```
確認創建成功與否
```code=
CREATE TABLE IF NOT EXISTS userinfoVER1 (
email varchar(100),
name varchar(40),
uid integer PRIMARY KEY
);
```

後來決定不紀錄public key主要因為其實照理來說這個public key本來就是公開的,根本沒有必要記在DB內(還有就是長度會至少大於2048,很難處理)
DB建起來之後,在python寫create指令...之類的
後端進度:
python架構完成,加下來要測試看看寫的東西能不能動
### 後端(前端與後端溝通)
**嘗試用flutter連到後端DB(http request)**
遇到版本問題


--> 先暫時降低http版本,可以運作



目前不知道怎麼解決,查chatgpt是說有可能CORS、firewall問題。
ref: [http request 教學](https://www.bing.com/videos/riverview/relatedvideo?&q=flutter+and+python+flask&&mid=3C235EB5CE40F9804AC63C235EB5CE40F9804AC6&&FORM=VRDGAR)
## 建議
回饋
1. 虛擬機連網的問題
2. API server的位置
3. 電腦本身有問題(比如說開啟網路分享) (我之前有遇過開分享電腦網路出事過)
---
# 1011 Update
## Outline
給海報初版
架構跟國科會很像(小論文架構)、提供適當app截圖
系統架構為主
related works(文獻探討與回顧)可以減量
在書寫的時候,我們最初完整的規劃來呈現(說我們的規劃有什麼...)
完整研究、完整規劃、不寫我們還沒弄完、FIDO還是要寫
(不管有沒有要DEMO,就先弄已經完成的)
和安全晶片和FIDO為我們的主要亮點
### 書面報告(10/12完成)
拿[國科會的計劃書](https://docs.google.com/document/d/1qd-uv_fQHID_1c8jekXN07fiFuuEU-jxjLUSsJO-8vg/edit)來改
多一個section(**寫我們**現在**做了啥**)
研究方法與步驟 -> 研究分析與結果
### 海報(下次meeting前)
填模板
- abstract
在我們的日常生活中,每個人手中都有一台手機可以儲存大量的個人資訊像是照片、行事曆、聊天訊息、簡訊......等,手機資料的安全性就成為重要的問題,因此負責加密資料的「安全晶片」扮演著重要的角色,而安全晶片除了可以保護手機的個人資料外,也能應用在電子投票、電子錢包......等需要安全性的場合上。同時,使用FIDO的身分認證標準可以讓我們去驗證一個人的身分。
因此本研究著手於實作一款投票APP並利用安全晶片加密選票以及使用FIDO對選民進行身分驗證避免死人投票或是幽靈人口,以滿足在無記名投票的場合中能符合各種安全性的需求,並同時兼顧APP使用上的便利性與敏捷性,方能將這款APP應用在未來更多、更廣的場合上。
最後身為資訊工程專業的學生,我們希望能利用課堂中或網路上所學的知識來解決實作投票APP上遇到的種種問題,例如身分驗證、灌票、幽靈人口......等,同時保護選民的隱私以達到安全上的匿名性。
- structure
(需要找到流程圖在哪邊,不夠的話要自己畫)

- result
(複製前端的截圖)
我們為了實作出FIDO WebAuthn,從原本Naive的解法,改成自己重新寫後端;也就是說,原本可以只用Firebase相關API來完成登入,但因為Firebase並沒有支援FIDO,於是我們決定自行實作。
為了將我們自己的後端接上來,我們對初始版本的APP作了以下的改動:
- 前端:
在前端部分在選擇登入/註冊後,相比於初始版本是和Firebase進行登入請求,會先與我們的server發送註冊請求,以取得Challenge值。前端調用 Andorid FIDO2 API,將Challenge值傳給身分驗證器從身分驗證器取得簽名(用預設的私鑰,對新生成的公鑰以及challenge簽名)回傳給我們的server驗證已完成註冊。登入時,流程類似,差別在調用的function 不同。總之,經過修改後,前端是否能夠登入,是依照app與sever之間的驗證,經過確認後將再由我們的server產生token使得我們的app能存取資料。
- 安全晶片:
無論使用者在第一次註冊時,或是在登入驗證身分的時候都會產生/用到私鑰,安全晶片可以為我們生成公私鑰對,並將私鑰保存在手機中的安全晶片上。透過生物辨識(指紋、臉部…)將需要簽署的challenge送進安全晶片裡進行運算後,再將簽署後的結果從晶片中送出來。在整個過程中私鑰不會離開安全晶片,因此不會有私鑰外流的風險。
- 後端:
後端用Python Flask作為框架,架設在Google Cloud Platform上面,並在GCP建立VM來Serve HTTP Request。使用者資訊例如email, uid等會儲存在DB內,編輯方式是藉由在Python裡引入Google Cloud SQL API以對資料庫進行新增、修改或刪除。另外也使用挑戰響應機制來驗證身分,Server會在驗證身分之後,傳回JWT格式的資料回到前端APP,以幫助前端將使用者資訊傳遞給Firebase。後端還會儲存Assetlinks,來幫助前端導向正確的目標。
- conclusion
我們的電子投票系統允許使用者在任何地方進行註冊並採用FIDO認證標準。
由於該帳號的私鑰被保護在註冊服務時使用的手機的安全晶片中,因此每次登入此帳號時必須使用相同的手機。這保證了「一機一帳號」,每個帳號的投票結果必然來自註冊的手機。
與現在各式各樣的投票APP相比,我們的電子投票系統,提供百分比投票模式,能以百分比形式,將投票者持有的選票以百分比的方式分配給各個候選的項目。
在參與投票時,利用QRCode技術讓大家方便取得投票連結,在兼顧便利性的同時,也能用來做投票者的合法性的控管,如一個人只能掃一次邀請碼,在小規模投票中,保證「一人一機」。
最後我們希望在中小型會議中引入我們電子投票的系統,利用我們系統有一定保證的安全性、更便利、不忽視所有人想法的特點提供電子投票的服務,不僅能讓投票流程更快速、便利,同時也能讓更多人知道安全晶片在生活上的應用。
- future work
首先,由於我們只能在組內進行各項測試,並沒有辦法知道可能因為機種不同而導致的問題,因此我們會在短期內將此APP給校內社團使用。藉由校內社團的使用與回饋,我們才有方向做下一個版本的優化更新。
接著,中期的目標是移植到IOS。因為我們現在的APP主要運行在Android,我們希望可以在更遠一點的未來,讓這款APP也能在IOS上面運作。之所以訂為中期目標的原因是,IOS跟Android的安全晶片不同,可能在實作或安全的考量上,會有不同的做法。
最後,說到更長期的目標,我們會往規模提升這部分走。因為目前的投票規模僅限於學校社團、班級課堂這種最小規模的投票,我們只需要顧及少數安全部分;而當投票規模增加,可能發生的安全問題就會更多,就需要將更多演算法納入考量。
## 建議
回饋
1. 格式 標題**大小寫**不一
2. 摘要是整個研究的預覽
3. 我們的貢獻是什麼,我們的主體是什麼?
4. 應該要把書面報告中的一些文字內容(要給result和strucutre相應的文字說明)
5. Result占了太大的空間,感覺內容空泛(跟conclusion格子一樣大)
6. structure的圖應該在大一些,提升**可讀性**,另外strucutre的圖的字應該要用比較正式的字體)
7. 文字段落的對齊應該要一致(左右對齊)
8. 中文英文中間要加一個半形的空格
9. iOS, not IOS / App, not APP
10. 截圖應該要去背(套格截圖,把手機外的背景去掉)
11. 注意每個格子內的字體、字型、大小、行距要統一
12. 內容確定之後調整行高、行距
13. 檔案匯出後要再檢查一下格式
14. 繼續改報告和海報,目前的東西還須要修改
15. 創新性?實務上是有用的,但是從我們的說明上沒看出來 => 更深入的陳述
16. 別人沒解這個問題嗎?我們的解決方案到底哪裡做的比較好
17. 新建的後端?什麼是新建的,在文字成果報告上看不出來,應該做說明(工作日誌!=成果報告)
18. 書面優先,等書面交出去後再推一點code進度
19. 書面時間,先壓最晚下周四前(10/26)給第二版
20. abstract(我們整份報告的縮影), introduction兩者擇一。
related work(別人做了什麼類似東東解我們想解的問題), system design(methodology), evaluation(優缺點、跟別人比較), discussion, conclusion
22. 海報缺 (1)system design文字 (2)evaluation(跟其他voting solution差在哪, optional, 看空間夠不夠寫)
---
## 1026
書面內容 -> 書面外觀 -> 海報外觀
- [ ] 書面內容(楊): 安全晶片、evaluation、研究方法步驟、潤飾(去除口語)
- [ ] 書面外觀(祝): 幫書面排版、幫忙畫流程圖
- [ ] 海報外觀(簡): 要改報告的架構、新增method(文字)、design(特別放圖的區域)、evaluation(表格)
- [ ] 後端測試(吳): trace code or test
### Outline
摘要減少字數
這份研究致力於開發一款安全的投票APP,應對日常生活中手機資料的安全性需求。通過安全晶片的應用,該APP能加密選票,同時運用FIDO身分認證標準驗證選民身分,有效防範死人投票和幽靈人口問題。本研究具體貢獻為: (1)設計一種適用於無記名投票的機制,確保了便捷性和敏捷性,並使其能廣泛應用於各種場合;(2)提供一種投票APP設計,讓小規模投票也能享有可靠的投票。
研究方法與步驟
貼流程圖,並且一個階段一個階段寫如何實作的
研究結果刪除(合併至研究方法)
研究分析(evaluation)
先每項都大致上講一次、比較,最後上表格
結論跟未來合併 -> 變成結論與未來方向
其他的部分無須調整,只要潤飾
### 後端
ref: [get api video](https://www.youtube.com/watch?v=ExPFnu8Dm40&t=247s)
### 換google cloud
因為google cloud要錢,所以轉移資料到吳振群那邊



## 重要!
資料庫的URL 填在python_SQL repo那邊
前端的URL 填VM的URL
以下是資料庫的URL

將經RSA encode過的值傳到app.py ... 對應server中的GET
app.py decode確認不是public的值 ... 對應server中的GET
if 通過, then call register/sign in ... 對應server中的POST
else 報錯 ... 對應server中的POST
---
# 1102 Updating
## Outline
1. 先討論書面報告跟海報需要做甚麼修改
2. 後端目前有做兩個版本: 一個是單純get/post,另一個是AI用LINE的FIDO API生出來的
## 後端版本
cloud shell 指令:
gcloud sql connect fido-demo --user=postgres




先用postman測試
再用flutter + python測試(先能取得資料,再來要把資訊傳回給前端)
## Problems
local run app.py, insert some data to DB. -> timeout
送出去之後就直接不見了。
考慮過的問題:
- firewall/SSL: 已經全開了
- Name: 測試過很多個版本,結果大致相同
- IP: 有分成public IP&導出的IP,兩個測出來沒差


## next-steps
1. 從localhost測試能不能遠端insert/select data到cloud sql
2. 能不能從flutter送request到VM(觀察API request frequency)
## 建議
---
# 1116 Updating
## For Presentation
想問學長報告的時候要注意甚麼呢?
比如說要偏重哪邊講?
或是需要在報告給教授前,先報告給學長聽一次呢?
## Milestones
現在的進度
1. 由於FIDO API需要finger print(我們之前使用的是JSON格式),我們在VM上面部屬了HTTPS開頭的網址
2. 前端跟後端的溝通目前使用HTTP來GET/POST,目前Request的部分沒有問題
3. 後端可以藉由Python code來insert資料到cloud DB中,也可以select資料出來
4. 我們搞清楚了自己建的Server是所謂的RP Server(LINE API中的RP Server)
[參考的HTTPS](https://hackmd.io/@JB-Lin/B1JEPsqIw)
[HTTPS assetlinks](https://fidohost.ddns.net/.well-known/assetlinks.json)
## TODO
1. 後端儲存key handle到DB(問題是長度還不確定)
2. 後端能夠驗證attestation OBJ(驗證方法還要再查,或是查API)
3. 後端可以產生JWT(查parser相關資料)並傳到前端
4. 前端的BUG解決

## 建議
1. XX
---
# 1123
## TODO
1. 寫稿
2. 做投影片
3. 把前後端串起來
## 分工
[投影片大綱](https://hackmd.io/@zRWCfXc1TOaCsnINOAPeCw/HkkDB4G12)
## Schedule
1123 DEMO給學長看
1124 DEMO給老師看
## FEEDBACK
- 建議
1. demo register的時候用有意義的名字
2. private vote,一隻創投票、一隻被邀請
3. ~~我想把我的Result那張投影片刪除~~
- QA 準備方向
1. why FIDO? ans:因為無密碼不會被偷、私鑰偷不走
2. 身分驗證具體來說的意思? ans:我們使用強生物認證(?),用指紋代表身分
3. 安全晶片安全的地方在哪邊?用途為何? ans:無法直接對安全區域內的資料存取
4. 如果手機沒有安全晶片的話,會怎麼樣? ans:公私鑰加密還是可以做,安全性會降低,因為作業系統被破壞之後資料會洩漏。
---