用一个原始密码针对不同软件生成不同密码并保证相对安全
使用一个密码并在数据泄漏时保护自己的其它账号
关于密码
现在好多软件,好多网站都需要我们设置密码,这个时候我们的处理办法一般分为2种。
- 对不同的软件设置不同的密码,这种理论上是最安全的,但是记不住啊,所以不实用。
- 对于不同的网站和软件使用相同的一套密码,反正我的号又不值钱,泄漏就泄漏了。
学习通案例
案例:网传学习通数据库泄漏,用户id和密码被扒,并有用户的qq被盗。——某通出来挨打
某通说自己存的不是明文,是经过加密的,但是被网友扒出来是用的base64编码,而base64根本不是加密算法,就是根据编码后的结果可以反推出来原文,也就是编码过程和解码过程。而真正的加密算法都是单向的,就是用加密后的结果是无法反推原密码的。
某通是懂加密算法的。
一个解决办法
那能不能综合以上两种方法,用一个密码并达到不同密码的效果。
今天上课时操作系统老师提供了一个思路,就是使用一个密码加上不同网站或App的标识,经过一个哈希加密算法,如md5、sha256。
而这类算法的特点如下:
哈希,英文叫做 hash。
哈希函数(hash function)可以把 任意长度的数据(字节串)计算出一个为固定长度的结果数据。
我们习惯把 要计算 的数据称之为 源数据, 计算后的结果数据称之为 哈希值(hash value)或者 摘要(digests)。
有好几种哈希函数,对应不同的算法, 常见有的 MD5, SHA1, SHA224, SHA256, SHA384, SHA512哈希计算的特点是:
相同的 源数据, 采用 相同的哈希算法, 计算出来的哈希值 一定相同
不管 源数据 有多大,相同的哈希算法,计算出来的哈希值长度 都是一样长的。
- 也就是说,不能通过 哈希值 反过来计算出 源数据。 所以哈希和我们常说的加密解密不同。
- 不同的源数据 使用同样的哈希算法,可能会产生相同的 哈希值,这被称之为碰撞率(collision rate)
https://blog.csdn.net/qq_41332844/article/details/126837319
下面使用md5算法实现这个想法。
C++实现(后面发一个python的,会比较简单)
C++没有官方的md5库,要自己写,还是看看远方的python吧
首先,如果我们常用的密码是123456,我们要为CSDN设置密码,就可以将
123456CSDN作为函数的输入,输出的哈希值即为我们想要的结果,而md5算法一般会输出一个32位的字符串,而一般我们的密码最长为16位,按照一般的做法,我们一般取第8-24位作为密码。
C++实现
期末了有点忙,现在写了个简陋的程序,等之后一定写一个图形页面的程序~~
#include"md5.cpp"
#include<iostream>
#include<cstring>
#include<stdlib.h>
using namespace std;int main(){string source_pwd; //我们自己的那1个密码string sign; //网站或APP的标识 ,如 CSDN、QQ、微信(weixin) //不过汉字最好改成拼音,防止因为编码出现问题string input;string output_32,output_16;cout<<"输入原密码"<<endl;cin>>source_pwd;cout<<"输入网站(app)标识"<<endl;cin>>sign;input=source_pwd + sign;output_32=getMD5(input);output_16=output_32.substr(8,16); //取output_32的第8-24位。cout<<"结果为:"<<output_16<<endl;system("pause");return 0;
}
Python实现
#python
import hashlib #python自带的哈希函数库
import reprint("输入原密码")
source_pwd=input()print("输入网站(app)标识")
sign= input()input_str=source_pwd + signoutput_32 = hashlib.md5(input_str.encode("utf-8")).hexdigest()#取32位md5值的8-24位
output_16=output_32[8:24]#把第一个小写字母变大写
print(re.sub("([a-zA-Z])", lambda x: x.groups()[0].upper(), output_16, 1))
还可以用在线网站进行加密
https://www.sojson.com/encrypt_md5.html
运行结果
也就是说在基础密码为123456的情况下
我们CSDN的密码应该是 5C76af8af8d85310
而微信的密码话应该是 24E9537395d3b37c
其它的密码如QQ、学习通同理,我们在保存时只需要在文件或记事本里保存网站的标识即可,这样即使别人拿到也无法盗取密码,并且某一软件的密码被盗取也不会影响其它软件。
md5.cpp是外部的文件,需要添加并引用(引自百度百科)
#include<iostream>
#include<string>
using namespace std;
#define shift(x, n) (((x) << (n)) | ((x) >> (32-(n))))//右移的时候,高位一定要补零,而不是补充符号位
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))
#define A 0x67452301
#define B 0xefcdab89
#define C 0x98badcfe
#define D 0x10325476
//strBaye的长度
unsigned int strlength;
//A,B,C,D的临时变量
unsigned int atemp;
unsigned int btemp;
unsigned int ctemp;
unsigned int dtemp;
//常量ti unsigned int(abs(sin(i+1))*(2pow32))
const unsigned int k[]={0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391};
//向左位移数
const unsigned int s[]={7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21};
const char str16[]="0123456789abcdef";
void mainLoop(unsigned int M[])
{unsigned int f,g;unsigned int a=atemp;unsigned int b=btemp;unsigned int c=ctemp;unsigned int d=dtemp;for (unsigned int i = 0; i < 64; i++){if(i<16){f=F(b,c,d);g=i;}else if (i<32){f=G(b,c,d);g=(5*i+1)%16;}else if(i<48){f=H(b,c,d);g=(3*i+5)%16;}else{f=I(b,c,d);g=(7*i)%16;}unsigned int tmp=d;d=c;c=b;b=b+shift((a+f+k[i]+M[g]),s[i]);a=tmp;}atemp=a+atemp;btemp=b+btemp;ctemp=c+ctemp;dtemp=d+dtemp;
}
/*
*填充函数
*处理后应满足bits≡448(mod512),字节就是bytes≡56(mode64)
*填充方式为先加一个1,其它位补零
*最后加上64位的原来长度
*/
unsigned int* add(string str)
{unsigned int num=((str.length()+8)/64)+1;//以512位,64个字节为一组unsigned int *strByte=new unsigned int[num*16]; //64/4=16,所以有16个整数strlength=num*16;for (unsigned int i = 0; i < num*16; i++)strByte[i]=0;for (unsigned int i=0; i <str.length(); i++){strByte[i>>2]|=(str[i])<<((i%4)*8);//一个整数存储四个字节,i>>2表示i/4 一个unsigned int对应4个字节,保存4个字符信息}strByte[str.length()>>2]|=0x80<<(((str.length()%4))*8);//尾部添加1 一个unsigned int保存4个字符信息,所以用128左移/**添加原长度,长度指位的长度,所以要乘8,然后是小端序,所以放在倒数第二个,这里长度只用了32位*/strByte[num*16-2]=str.length()*8;return strByte;
}
string changeHex(int a)
{int b;string str1;string str="";for(int i=0;i<4;i++){str1="";b=((a>>i*8)%(1<<8))&0xff; //逆序处理每个字节for (int j = 0; j < 2; j++){str1.insert(0,1,str16[b%16]);b=b/16;}str+=str1;}return str;
}
string getMD5(string source)
{atemp=A; //初始化btemp=B;ctemp=C;dtemp=D;unsigned int *strByte=add(source);for(unsigned int i=0;i<strlength/16;i++){unsigned int num[16];for(unsigned int j=0;j<16;j++)num[j]=strByte[i*16+j];mainLoop(num);}return changeHex(atemp).append(changeHex(btemp)).append(changeHex(ctemp)).append(changeHex(dtemp));
}
用一个原始密码针对不同软件生成不同密码并保证相对安全相关推荐
- mysql临时密码不能用,自动生成临时密码后无法访问MySQL
自动生成临时密码后无法访问MySQL 我已经删除并安装了OSX 10.11 El Capitan并且我一直在通过本教程学习如何在新的OS X上运行MySQL .第一步是下载MySQL For Mac ...
- qq密码自动测试软件,QQ2004测试版密码获取演示
QQ2004测试版密码获取演示 2004-6-2 19:14 2715 QQ2004测试版密码获取演示 2004-6-2 19:14 2715 水平不高,请大家包涵 最近快毕业了,比较忙.... 如果 ...
- java如何声明一个数组用来存储随机生成的字母并且保证不重复
要生成随机字母比较简单,这里主要是向分享一个保证不重复的方法,代码量很小但是实现了目的. char[] res = new char[level]; for (int i = 0; i < le ...
- WWDC18 iOS 自动生成强密码和自动填充验证码/密码
概述 本文将介绍WWDC18 Automatic Strong Passwords and Security Code Autofill和WWDC17 Introducing Password Aut ...
- 随机生成一个6/8/12位密码,数字加字母的密码
一 数字密码: 二 封装的数字密码 三 数字加字母的密码 四 随机不重复的6-8位密码 转载于:https://www.cnblogs.com/pxzbky/p/10324495.html
- 实时的软件生成 —— Prompt 编程打通低代码的最后一公里?
PS:这也是一篇畅想,虽然经过了一番试验,依旧有一些不足,但是大体上站得住脚. 传统的软件生成方式需要程序员编写大量的代码,然后进行测试.发布等一系列繁琐的流程.而实时生成技术则是借助人工智能技术,让 ...
- KeePass Password Safe(互联网密码管理器软件)官方中文版V2.48.1 | 密码管理工具哪个好用?
KeePass Password Safe 是一款免费开源轻便安全且易于使用的专业互联网密码管理器软件,作用跟填表小子(Roboform)一样,也是用来帮助用户安全保存用户在互联网上的各种密码,并能帮 ...
- 一键生成流量密码(夸张广告标题)
一键生成流量密码(夸张广告标题) 1. 引言 相信大家会经常在微信公众号或者某站看到很高阅读量的夸张引流标题,都是一些卖课的营销广告,笔者平常看到他们就记录下来,打算在某个不忙的时间点吐槽一下,昨天笔 ...
- 分数统计设计java程序_(windows综合程序)设计一个学生平时成绩统计软件 最后的Java作业...
1.(windows综合程序)设计一个学生平时成绩统计软件.要求: (1) 录入课程名称(进入系统时录入).学生姓名.学号.成绩.日期(自动生成日期并在界面显示),除第一次外其他次数输入只需要录入学号 ...
最新文章
- Maya摄像机动画技能学习教程
- Android 是移动世界的鸭嘴兽
- 德州扑克里的专业术语你知道几个?
- 轴承新旧型号对照表_精密机床主轴轴承,高端轴承进口清关报关流程
- python缩进教学_Python缩进和选择学习
- Linux 系统添加静态路由的方法
- java mysql mac 安装_最新版MySQL在MacOS上的安装与使用!
- Squirrel Engine 曝漏洞,可导致攻击者入侵游戏和云服务
- elasticsearch6.0、jdk1.8、IK、kibana集群配置
- 20170917软件工程师在线笔试之员工幸福感问题
- 科研作图软件介绍附带AI安装包
- Power bi 3.18 仪表盘
- 全球与中国铝合金窗型材市场规模预测与产销前景调研报告2022版
- c语言ans作用,ANS标准定义C语言是什么?
- 教师节祝福短信:送给有个性的老师
- Mac OS X下的动态链接库
- 业务设计师(产品经理)P级晋升必备职能(P3-P7)
- Unity3D UDP通信
- 计算机英语名词简释(转)
- android nohttp百度百科,百度百科宣布取消扩展阅读并给外链添加nofollow标签