基于cryptopp -- A Password Manager密码管理系统

系统设计安全目标

  • 私密性(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 = (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值