自制密码管理系统

  现在越来越多的网站或者系统需要我们输入密码,通常我们会选择一种密码,这样记起来比较方便,一个密码闯天下。可是这样使用一种密码的也会出现其他的问题,比如:

  • 不安全,若其中一个网站的密码被泄露了,其他网站也就不安全了;
  • 有限制,有时候我们使用的密码在某个网站的限制规则下,并不能使用。比如我们常用的密码里都是小写字母和数字,可是这个网站要求我们的密码必须包含特殊字符。或者我们使用的密码是20位的,可是这个网站的密码要求最多只能15位。
  • 网站太冷门,我们好长时间也访问不了一回。好不容易访问一回,结果第二次访问时忘记了密码。

  考虑到上面的情况,我们需要再想一种密码,当遇到的情况多了,密码也就不好管理了。直接存储吧,怕被别人看到,不直接存储吧,也不知道放到什么地方。而现在网上也有很多的密码管理软件,只是我本人对这些东西不是很放心,因为它是把我们的密码加密后存储到他的服务器上,加入他的服务器被破解了,那我们所有的密码都会被泄露。因此我就想写一个属于自己的密码管理系统!

  当然,如果这个网站的找回密码更简单一些的话,那就使用这个网站提供的找回密码

  本来是想做出一种列表式的,把所有密码加密后存储到数据库中。可是因为没有现成的空间和数据库,如果使用本地数据库,那么在这个电脑上存储的密码,在另一个电脑上是获取不到的。

  因此就修改了一下策略,程序放在本地,只提供密码的加密和解密功能,使用邮箱、云盘等工具来存储加密后的字段。如果其他电脑要使用,那么就把该程序clone到本地,解密那个字段就能得到密码。

讲解一下我存储密码的思路。
需要的字段有:

  1. url : 要存储密码的网站,也可以是个单词或者字符,只要自己认识就行
  2. password : 加密该密码的密钥;
  3. content : 存储的密码;

  加密的方法采用的是公认的AES。这种加密方式的复杂程度是全世界公认的,解密起来非常的复杂。

  AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“状态(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。(Rijndael加密法因支持更大的区块,其矩阵行数可视情况增加)加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤: 1. AddRoundKey — 矩阵中的每一个字节都与该次轮秘钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。 2. SubBytes — 通过个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。 3. ShiftRows — 将矩阵中的每个横列进行循环式移位。 4. MixColumns — 为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每列的四个字节。 最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey取代。

  当然,里面的很多原理其实我们不用了解的很深,但是我么应该学会怎么使用,AES的加密和解密都需要两个参数:encrypt($input, $key)decrypt($sStr, $sKey)。第一个参数是我们要操作的字符串,第二个参数是加密和解密的key值,通常加密和解密需要的是同一个key值。

  关于AES的更多信息,可以点击这里【AES-百度百科】【AES-维基百科

  从上面的内容我们可以看到,如果要加密的话则要两个字段:需要加密的字符串和key值;解密时需要的两个字段:需要解密的字符串和key值。因此,我的加密过程是这样的:
  1. 确定key值:

$code = substr(md5(time()."wenzi".rand(1000, 9999)), 4, 10);// 需要记住
$key = md5($password.‘wenzi‘.$code);

  从上面的代码可以看出,$key值取决于我们输入的password值和由系统生成的code值。

  2. 需要加密的字符串:不是把密码直接进行加密,而是$url和$content拼接起来进行加密,等解密时需要验证输入的url是不是当时加密时的url,如果不是则获取不到密码。

  3. 加密:$content = encrypt($url.$content, $key);

  4. 确认解密时需要的字段:$url(当时加密时的网址), $code(第一步中随机生成的字符串), $password(密钥), $content(需要解密的内容)

  为了防止别人看到直接存储的code值,我们可以让程序按照我们的需要进行返回,我的程序里,code值是长度为10的字符串, 返回时我们看到的code是:前5位是单数位,后5位是双数位,解密时需要交替输入。

$e1=""; $e2="";
for($i=0; $i<strlen($code); $i++) {
    if($i%2==0){
        $e1 .= $code[$i];
    }else{
        $e2 .= $code[$i];
    }
}
$e = $e1.$e2;

  当然你也可以使用如下的策略:前5位是code的后5位,后5位是code的前5位;code的倒序等。别人只是看到经过程序处理过的code,而不知道code的排列顺序

  我们来使用程序加密一次试试:

  加密成功后返回的数据是:

www.xiabingbao.com  3cf06d4ce6  TTkbT5BL30nIyXV+WymNgvnJwO2moLQ/LD0R4rOROOo=

  三个字段分别表示:url,系统随机生成的code值,加密后的字符串

  如果某一天我们忘了密码,则可以通过存储的上面的那3个字段和之前我们输入的密钥找回这个网站的密码。

$key = md5($password.‘wenzi‘.$code);
$result = $aes->decrypt($content, $key);

if(strpos($result, $url)>-1){
    $msg = substr($result, strlen($url));
    $s = array(‘status‘=>0, ‘msg‘=>$msg);
}else{
    $s = array(‘status‘=>2, ‘msg‘=>"验证错误");
}

  首先通过$key和需要解密的字段$content来把$content解密出来$result,解密出来后再判断$result里是否包含$url字段,如果没有包含$url则解密失败,否则就把密码返回给用户。

  假如有人获取到你了保存的加密串,如果他没有你的程序也是解不开的;即使加密串和程序都获取到了,他也没有你的密钥,因为密钥是存在你心里的,没有存放在其他任何的文件上。

  好了,或许有些人觉得这样保存密码很麻烦。我呢,就把它当做一次练手的项目了,顺便存储些比较偏僻网站的密码。在写这个系统时,主要学习了AES算法和bootsrap的使用。

  github地址:github-password

  原文地址:http://www.xiabingbao.com/password/2015/03/08/make-passwork/

【参考】:
AES加密PHP版
bootsrap

时间: 2024-10-09 06:02:15

自制密码管理系统的相关文章

账号密码管理系统Access版本

哈哈,花了我整整五天时间,账号密码管理系统软件终于成功编写完成了.由于我的各大论坛的账号密码特别多,记性又不好.所以一直以来都想要这么一个软件的,但是以前学习的都是面向过程的编程语言,一直无法实现这个想法.这个暑假为了做一个程序项目,对记事本实现图形用户界面增删改查操作,所以开始学习C#编程.在花了整整二十天学习Winform编程和研究文件读写流(大多数时间在学习文件读写流上,Winform编程也就学会了几个常用的控件,文件读写流这个边读边写刚开始不会,特别蛋疼),好在经过一番努力学习后终于实现

PyQt4入门

PyQt4入门教程(6)_对话框 文中译者的话将用方括号[]标出.对话框(Dialogs)是现代GUI程序中不可缺少的一部分.对话本来指的是两个或者更多人之间的交流,而在计算机应用中,对话是一个可以让我们和应用"说话"的窗口.对话框可以用来输入数据.修改数据.更改应用设置等等.QtGui.QInputDialog类QtGui.QInputDialog类提供了一个简单便捷的对话框来从用户处得到一个单值.用户的输入可以是字符串.数字,也... 2016-03-08 00:00 阅读(888

UI进阶 数据加密

一.数据安全 在互联网发展趋势迅猛的今天,数据安全的重要性日趋凸显.也成为我们必须了解的互联网知识.在移动互联网浪潮下,用户的资金安全.企业的信息安全都是我们实际开发中必须考虑的内容. 相关术语: 密钥:密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数.密钥分为对称密钥与非对称密钥(也可以根据用途来分为加密密钥和解密密钥) 明文:没有进行加密,能够直接代表原文含义的信息 密文:经过加密处理处理之后,隐藏原文含义的信息 加密:将明文转换成密文的实施过程 解密:将密文转换成明

ASIHTTPRequest类库简介和使用说明

官方网站: http://allseeing-i.com/ASIHTTPRequest/ .可以从上面下载到最新源码,以及获取到相关的资料. 使用iOS SDK中的HTTP网络请求API,相当的复杂,调用很繁琐,ASIHTTPRequest就是一个对CFNetwork API进行了封装,并且使用起来非常简单的一套API,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中.ASIHTTPRequest适用于基本的HTTP请求,和基于REST的服务之间的交互.

iOS网络编程模型

http://www.cnblogs.com/ydhliphonedev/p/3240772.html Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServices OS层:基于 C 的 BSD socket Cocoa层:是最上层的基于 Objective-C 的 API,比如 URL访问,NSStream,Bonjour,GameKit等,这是大多数情况下我们常用的 API.Coc

iOS ASIHTTPRequest详解

ASIHTTPRequest对CFNetwork API进行了封装,并且使用起来非常简单,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中.ASIHTTPRequest适用于基本的HTTP请求,和基于REST的服务之间的交互. ASIHTTPRequest功能很强大,主要特色如下: l 通过简单的接口,即可完成向服务端提交数据和从服务端获取数据的工作 l 下载的数据,可存储到内存中或直接存储到磁盘中 l 能上传本地文件到服务端 l 可以方便的访问和操作请

python基础学习05(核心编程第二版)部分

# -*- coding: utf-8 -*- # ==================== #File: python #Author: python #Date: 2014 #==================== __author__ = 'Administrator' #dict{键:值} #哈希 #注:字典是无顺序的,所以你懂的 #创建与赋值 dict1={} dict2={'name':'apply','avg':24,'sex':'man'} print dict1,dict2

IOS-网络(ASIHTTPRequest的使用简介)

使用iOS SDK中的HTTP网络请求API,相当的复杂,调用很繁琐,ASIHTTPRequest就是一个对CFNetwork API进行了封装,并且使用起来非常简单的一套API,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中.ASIHTTPRequest适用于基本的HTTP请求,和基于REST的服务之间的交互. ASIHTTPRequest功能很强大,主要特色如下: l 通过简单的接口,即可完成向服务端提交数据和从服务端获取数据的工作 l 下载的数据

Linux多线程服务端编程:使用muduo C++网络库

内容推荐本 书主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread.这是在Linux下以native语言编写用户态高性能网络程序最成熟的模式,掌握之后可顺利地开发各类常见的服务端网络应用程序.本书以 muduo网络库为例,讲解这种编程模型的使用方法及注意事项.本书的宗旨是贵精不贵多.掌握两种基本的同步原语就可以满足各种多线程同步的功能需求,还能写出更易用的同步设施.掌