# 55屆公開第五題
## 題目要求:
(1) 設計畫面,包含系統標題、文字標籤、兩個 TextBox 控制項:txtUsername 和
txtPassword,分別用於輸入使用者名稱和密碼,密碼顯示為 * 符號。
(2) 新增兩個 Button 控制項:btnRegister、btnCancel,用於觸發註冊事件與取消
輸入的帳密內容。
(3) 按下「註冊」按鈕時,將所輸入的帳號及密碼存入文字檔。
(4) 密碼加密須使用 SHA256 進行密碼 HASH 加密。
檔案結構為使用者名稱和密碼,以 | 分隔,密碼儲存為 HASH 值。
範例:user1|ed02457b5c41d964dbd2f2a609d63fe1bb7528dbe55e1abf5b52c249cd735797
user2|9834876dcfb05cb167a5c24953eba58c4ac89b1adf57f28f2f9d09af107ee8f0
(5) 若成功儲存檔案,則顯示「註冊成功!」訊息。
## 我的作法
### 介面
依照執行結果參考畫面拉出一模一樣的介面,密碼遮擋我是在PasswordChar將符號改成*

### 取消按鈕
這最簡單,直接寫一個close就好
```csharp
private void btnCancel_Click(object sender, EventArgs e)
{
Close();
}
```
### 註冊
把用戶輸入的字符改成要輸入進txt的格式(同時加密),然後寫入user.txt之後顯示註冊成功
```csharp
private void btnRegister_Click(object sender, EventArgs e)
{
string user_and_pwd = txtUsername.Text + "||" + BitConverter.ToString(SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(txtPassword.Text))).Replace("-", "")+ "\r\n";
using (StreamWriter sw = new StreamWriter("user.txt", true))
{
sw.WriteLine(user_and_pwd);
}
MessageBox.Show("註冊成功!","成功訊息",MessageBoxButtons.OK, MessageBoxIcon.Information);
}
```
#### 這串是什麼
這串看起來很複雜,他長這樣
```csharp
BitConverter.ToString(SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(txtPassword.Text))).Replace("-", "")+ "\r\n"
```
[這裡學姊有寫一個筆記](https://hackmd.io/@anna0212/S13dSfQK1g)
簡單來說就是
先轉換字串成位元組
```csharp
byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
```
然後計算 SHA-256 雜湊
```csharp
using (SHA256 sha256 = SHA256.Create())
{
byte[] hashBytes = sha256.ComputeHash(passwordBytes);
}
```
轉成16進制
```csharp
string hexHash = BitConverter.ToString(hashBytes);
```
移除-
```csharp=
string finalHash = hexHash.Replace("-", "");
```
就轉換好了
### 完整程式碼
不要直接使用,下面會有可以下載的檔案
```csharp=
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Net.Mime.MediaTypeNames;
namespace CSA05
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void btnCancel_Click(object sender, EventArgs e)
{
Close();
}
private void btnRegister_Click(object sender, EventArgs e)
{
string user_and_pwd = txtUsername.Text + "||" + BitConverter.ToString(SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(txtPassword.Text))).Replace("-", "")+ "\r\n";
using (StreamWriter sw = new StreamWriter("user.txt", true))
{
sw.WriteLine(user_and_pwd);
}
MessageBox.Show("註冊成功!","成功訊息",MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
```
### 運行結果



## 完整程式碼檔案
我放onedrive了(感謝教育局的15G空間)
[點我下載](https://o365oid-my.sharepoint.com/:u:/g/personal/zack1121_ntpc_ms_edu_tw/EQ4q974zj0VIqx-dFR_fN_4BLDySGP34ZxV5Kan6c5dmsA?e=SRigxD)
結構應該長這樣:
```
CSA05:
│ CSA05.sln
│
└─CSA05
│ App.config
│ Program.cs
│ CSA05.csproj
│ Form1.Designer.cs
│ Form1.resx
│ Form1.cs
│
├─Properties
│ AssemblyInfo.cs
│ Resources.resx
│ Resources.Designer.cs
│ Settings.settings
│ Settings.Designer.cs
│
├─bin
│ └─Debug
│ CSA05.exe.config
│ user.txt
│ CSA05.exe
│ CSA05.pdb
│
└─obj
└─Debug
│ .NETFramework,Version=v4.7.2.AssemblyAttributes.cs
│ DesignTimeResolveAssemblyReferencesInput.cache
│ CSA05.csproj.AssemblyReference.cache
│ CSA05.Form1.resources
│ CSA05.Properties.Resources.resources
│ CSA05.csproj.CoreCompileInputs.cache
│ CSA05.exe
│ CSA05.pdb
│ CSA05.csproj.FileListAbsolute.txt
│ CSA05.csproj.GenerateResource.cache
│ DesignTimeResolveAssemblyReferences.cache
│
└─TempPE
```