系统设计安全目标
- 私密性(confidentiality):消息内容不让其他人看到消息:只有该看的人才能看
- 完整性(integrity):消息不被其他人篡改或者篡改之后可以被发现:看到的消息是正确的
- 可用性(availability):加密后,解密仍然能够读到信息:想看随时看
基本功能
登录界面
提示用户输入用户名和master password
检查文档是否存在
- 不存在创建一个新的文档,并以输入的master password作为这个用户的master password
存在则检查文档中的master password(需要先进行解密)和用户输入的是否一致,
- 如果不一致则报错,保留在登录界面
- 如果一致则进行完整性检查:将每一行的网站域名抽出来通过HMAC做哈希,将哈希以后的值和保存的对应哈希值最对比,如果有某一项不一致则报错,保留在登陆界面;如果一致就进入用户功能界面
用户功能界面
功能1:实现对于网站域名 + 哈希值 + 加密以后的密码的增加
- 提示用户输入网站域名和密码
- 检查文档中是否有相同的域名,如果有则报错;没有则将网站域名 + 通过HMAC算出的哈希值 + 加密以后的密码增加到文件尾部,并输出成功信息
功能2:实现对于网站域名 + 哈希值 + 加密以后的密码的删除
- 提示用户输入网站域名
- 检查文档中是否有相同的域名,如果没有则报错;有则将对应的记录从该文档中删除
功能3:实现对于输入网站域名后对于密码的查询
- 提示用户输入网站域名
- 检查文档中是否有相同的域名,如果没有则报错;有则将对应加密后的密码解密后输出出来
功能4:实现对于输入网站域名后对于密码的修改
- 提示用户输入网站域名和密码
- 检查文档中是否有相同的域名,如果没有则报错;有则将输入的密码进行加密后替换掉文档中的对应项
功能5:返回登录界面
完整代码:
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <sstream>
//AES
#include "cryptopp563/filters.h" // StringSink, StringSource, StreamTransformationFilter
#include "cryptopp563/aes.h" // AES
#include "cryptopp563/modes.h" // CBC_Mode_*
//PBKDF2
#include "cryptopp563/base64.h" // Base64Decoder
#include "cryptopp563/sha.h" // SHA1
#include "cryptopp563/pwdbased.h" // PKCS5_PBKDF2_HMAC
#include "cryptopp563/hex.h" // HexEncoder
//HMAC
#include "cryptopp563/hmac.h" // HMAC<T>
using namespace std;
using namespace CryptoPP;
#define DEFAULT_STRING_SIZE (32)
//十进制与十六进制之间相互转换
string decToHex(byte num);//十进制转十六进制
byte hexToDec(string num);//十六进制转十进制
//CBC加密
string CBC_encrypt(string str);
string CBC_encrypt(byte* key, string source);
//CBC解密
string CBC_decrypt(string source);
string CBC_decrypt(byte* key, string source);
bool masterKey(string username, string password); //比对输入密码与txt密码是否一致
void integrity(string username); //文件内容是否具备完整性
//与key相关的哈希函数对domain进行加密
string digest(string key, string domain);
string deriveKey(string domain, string masterPassword);
void addNewKVS(string username, string password); //增加KVS
void deleteKVS(string username, string password); //删除KVS
void searchPassword(string username, string password); //查询对应域名下的密码
void changePassword(string username, string password); //修改对应域名下的密码
int main (int argc, char const *argv[]){
string username; //用户名
string masterPassword; //密码
string filename; //用户名补充文件名
string masterPasswordInTxt;
/* 登录界面 */
while(1){
//输入用户名和密码
cout << "\nPlease input the username and password." << endl;
cin >> username >> masterPassword;
//依据用户名读取文件
filename = username + ".txt";
char *masterPasswordChar = (