http://tool.chacuo.net/crypt3des 在线测试工具
crypto-js 手册
https://blog.zhengxianjun.com/2015/05/javascript-crypto-js/
单向加密:通过对数据进行摘要计算生成密文,密文不可逆推还原。算法代表:Base64,MD5,SHA;
双向加密:与单向加密相反,可以把密文逆推还原成明文,双向加密又分为对称加密和非对称加密。
对称加密:指数据使用者必须拥有相同的密钥才可以进行加密解密,就像彼此约定的一串暗号。算法代表:DES,3DES,AES,IDEA,RC4,RC5;
非对称加密:相对对称加密而言,无需拥有同一组密钥,非对称加密是一种“信息公开的密钥交换协议”。非对称加密需要公开密钥和私有密钥两组密钥,公开密钥和私有密钥是配对起来的,也就是说使用公开密钥进行数据加密,只有对应的私有密钥才能解密。这两个密钥是数学相关,用某用户密钥加密后的密文,只能使用该用户的加密密钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个密钥性质。这里把公开的密钥为公钥,不公开的密钥为私钥。算法代表:RSA,DSA。
======================================================
3DES算法
3DES是三重数据加密,且可以逆推的一种算法方案。
各种加解密算法分类及其各自的安全性能对比
常用的加解密算法分三大类:
非对称密钥加密算法、
对称密钥加密算法、
Hash加密算法
一、非对称密钥加密算法(RSA、DSA、ECC、DH等):
非对称加密又叫公开密钥算法(public key algorithm)。
设计:加密密钥不同于解密密钥,而且解密密钥不能根据加密密钥计算出来(至少在合理假定的长时间内)。之所以又叫做公开密钥算法是由于加密密钥可以公开,即陌生人可以得到它并用来加密信息,但只有用相应的解密密钥才能解密信息。在这种加密算法中,加密密钥被叫做公开密钥,而解密密钥被叫做私有密钥。非对称加密算法的加密、解密的效率比较低。在算法设计上,非对称加密算法对待加密的数据长度有着苛刻的要求。例如RSA算法要求待加密的数据不得大于53个字节。
注:1MIPS年是1MIPS的机器一年所能处理的数据量,如上表中的10000MIPS年,即表示处理速度为10000MIPS的CPU需要1年才能攻破。
表中红色表示不安全、黄色表示中等安全、绿色表示安全级别较高。
结论:
ECC算法抗攻击能力强、计算量小、处理速度快、存储空间小、带宽要求低。使得ECC在无线通信安全、IC卡数据加密等领域广泛应用。这些特点必将使其替换RSA等算法,而成为通用的公钥加密算法。
然而由于非对称算法本身的复杂性,使得其对大数据加解密的适用性不强,所以非对称算法常与对称加密算法结合使用,即利用非对称算法对对称算法的密钥进行加密传输。
Java代码的DH算法,参考:http://blog.csdn.net/kongqz/article/details/6302913
二、对称密钥加密算法(DES、3DES、AES等)
对称钥匙加密系统是加密和解密均采用同一把秘密钥匙,而且通信双方都必须获得这把钥匙,并保持钥匙的秘密。
三、Hash加密算法(MD5、SHA等):
散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。
各种加密算法比较
算法选择:对称加密AES,非对称加密: ECC,消息摘要: MD5,数字签名:DSA
对称加密算法(加解密密钥相同)
名称 密钥长度 运算速度 安全性 资源消耗
DES 56位 较快 低 中
3DES 112位或168位 慢 中 高
AES 128、192、256位 快 高 低
非对称算法(加密密钥和解密密钥不同)
名称 成熟度 安全性(取决于密钥长度) 运算速度 资源消耗
RSA 高 高 慢 高
DSA 高 高 慢 只能用于数字签名
ECC 低 高 快 低(计算量小,存储空间占用小,带宽要求低)
散列算法比较
名称 安全性 速度
SHA-1 高 慢
MD5 中 快
对称与非对称算法比较
名称 密钥管理 安全性 速度
对称算法 比较难,不适合互联网,一般用于内部系统 中 快好几个数量级(软件加解密速度至少快100倍,每秒可以加解密数M比特数据),适合大数据量的加解密处理
非对称算法 密钥容易管理 高 慢,适合小数据量加解密或数据签名
算法选择(从性能和安全性综合)
对称加密: AES(128位),
非对称加密: ECC(160位)或RSA(1024),
消息摘要: MD5
数字签名:DSA
轻量级:TEA、RC系列(RC4),Blowfish (不常换密钥)
速度排名(个人估测,未验证):IDEA <DES <GASTI28<GOST<AES<RC4<TEA<Blowfish
简单的加密设计: 用密钥对原文做 异或,置换,代换,移位
名称 数据大小(MB) 时间(s) 平均速度MB/S 评价
DES 256 10.5 22.5 低
3DES 256 12 12 低
AES(256-bit) 256 5 51.2 中
Blowfish 256 3.7 64 高
表5-3 单钥密码算法性能比较表
名称 实现方式 运算速度 安 全 性 改进措施 应用场合
DES 40-56bit
密钥 一般 完全依赖密钥,易受穷举搜索法攻击 双重、三重DES,AES 适用于硬件实现
IDEA 128bit密钥
8轮迭代 较慢 军事级,可抗差值分析和相关分析 加长字长为32bit、密钥为256bit,采用232 模加、232+1模乘 适用于ASIC设计
GOST 256bit密钥
32轮迭代 较快 军事级 加大迭代轮数 S盒可随机秘
密选择,便于软件实现
Blowfish 256-448bit
密钥、16轮迭代 最快 军事级、可通过改变密钥长度调整安全性 适合固定密钥场合,不适合常换密钥和智能卡
RC4 密钥长度可变 快DESl0倍 对差分攻击和线性攻击具有免疫能力,高度非线性 密钥长度放宽到64bit 算法简单,易于编程实现
RC5 密钥长度和迭代轮数均可变 速度可根据
三个参数的
值进行选择 六轮以上时即可抗线性攻击、通过调整字长、密钥长度和迭代轮数可以在安全性和速度上取得折中 引入数据相倚转 适用于不同字长的微处理器
CASTl28 密钥长度可变、16轮迭代 较快 可抵抗线性和差分攻击 增加密钥长度、形成CAST256 适用于PC机和
UNIX工作站
常见加密算法
1、DES(Data Encryption Standard):对称算法,数据加密标准,速度较快,适用于加密大量数据的场合;
2、3DES(Triple DES):是基于DES的对称算法,对一块数据用三个不同的密钥进行三次加密,强度更高;
3、RC2和RC4:对称算法,用变长密钥对大量数据进行加密,比 DES 快;
4、IDEA(International Data Encryption Algorithm)国际数据加密算法,使用 128 位密钥提供非常强的安全性;
5、RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的,非对称算法;
6、DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准),严格来说不算加密算法;
7、AES(Advanced Encryption Standard):高级加密标准,对称算法,是下一代的加密算法标准,速度快,安全级别高,;
8、BLOWFISH,它使用变长的密钥,长度可达448位,运行速度很快;
9、MD5:严格来说不算加密算法,只能说是摘要算法;
10、PKCS:The Public-Key Cryptography Standards (PKCS)是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。
11、SSF33,SSF28,SCB2(SM1):国家密码局的隐蔽不公开的商用算法,在国内民用和商用的,除这些都不容许使用外,其他的都可以使用;
12、ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。
13、TEA(Tiny Encryption Algorithm)简单高效的加密算法,加密解密速度快,实现简单。但安全性不如DES,QQ一直用tea加密
对称加密算法
对称加密算法用来对敏感数据等信息进行加密,常用的算法包括:
DES: 数据加密标准,速度较快,适用于加密大量数据的场合。
3DES: 是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。
RC2/RC4:对称算法,用变长密钥对大量数据进行加密,比 DES 快;
AES: 是下一代的加密算法标准,速度快,安全级别高;AES 标准的一个实现是 Rijndael 算法
AES与3DES的比较:
名称 算法类型 密钥长度 速度 解密时间(建设机器每秒尝试255个密钥) 资源消耗
AES 对称block密码 128/192/256位 高 1490000亿年 低
3DES 对称feistel密码 112/168位 低 46亿年 中
非对称算法
RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;
DSA:数字签名算法,是一种标准的 DSS(数字签名标准)严格来说不算加密算法;
ECC:椭圆曲线密码编码学。
ECC和RSA对比优势明显:
抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。
计算量小,处理速度快。ECC总的速度比RSA、DSA要快得多。
存储空间占用小。ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。
带宽要求低。当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。
RSA和ECC的安全性和速度的比较
攻破时间(MIPS年) RSA/DSA(密钥长度) ECC密钥长度 RSA/ECC密钥长度比
104 512 106 5:1
108 768 132 6:1
1011 1024 160 7:1
1020 2048 210 10:1
1078 21000 600 35:1
攻破时间(MIPS年) RSA/DSA(密钥长度) ECC密钥长度 RSA/ECC密钥长度比
104 512 106 5:1
108 768 132 6:1
1011 1024 160 7:1
1020 2048 210 10:1
1078 21000 600 35:1
RSA和ECC安全模长的比较
功能 Security Builder 1.2 BSAFE 3.0
163位ECC(ms) 1,023位RSA(ms)
密钥对生成 3.8 4,708.3
签名 2.1(ECNRA) 228.4
3.0(ECDSA)
认证 9.9(ECNRA) 12.7
10.7(ECDSA)
Diffie—Hellman密钥交换 7.3 1,654.0
RSA和ECC速度比较
散列算法
散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。
单向散列函数一般用于产生消息摘要,密钥加密等,常见的有:
l MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,非可逆,相同的明文产生相同的密文。
l SHA(Secure Hash Algorithm):可以对任意长度的数据运算生成一个160位的数值;
SHA-1与MD5的比较
因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:
l 对强行供给的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2128数量级的操作,而对SHA-1则是2160数量级的操作。这样,SHA-1对强行攻击有更大的强度。
l 对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
l 速度:在相同的硬件上,SHA-1的运行速度比MD5慢。
对称与非对称算法比较
以上综述了两种加密方法的原理,总体来说主要有下面几个方面的不同:
l 在管理方面:公钥密码算法只需要较少的资源就可以实现目的,在密钥的分配上,两者之间相差一个指数级别(一个是n一个是n2)。所以私钥密码算法不适应广域网的使用,而且更重要的一点是它不支持数字签名。
l 在安全方面:由于公钥密码算法基于未解决的数学难题,在破解上几乎不可能。对于私钥密码算法,到了AES虽说从理论来说是不可能破解的,但从计算机的发展角度来看。公钥更具有优越性。
l 从速度上来看:AES的软件实现速度已经达到了每秒数兆或数十兆比特。是公钥的100倍,如果用硬件来实现的话这个比值将扩大到1000倍。
三. 加密算法的选择
由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。
对称加密算法不能实现签名,因此签名只能非对称算法。
由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。
在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
那采用多少位的密钥呢? RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。
四. 密码学在现代的应用
保密通信:保密通信是密码学产生的动因。使用公私钥密码体制进行保密通信时,信息接收者只有知道对应的密钥才可以解密该信息。
数字签名:数字签名技术可以代替传统的手写签名,而且从安全的角度考虑,数字签名具有很好的防伪造功能。在政府机关、军事领域、商业领域有广泛的应用环境。
秘密共享:秘密共享技术是指将一个秘密信息利用密码技术分拆成n个称为共享因子的信息,分发给n个成员,只有k(k≤n)个合法成员的共享因子才可以恢复该秘密信息,其中任何一个或m(m≤k)个成员合作都不知道该秘密信息。利用秘密共享技术可以控制任何需要多个人共同控制的秘密信息、命令等。
认证功能:在公开的信道上进行敏感信息的传输,采用签名技术实现对消息的真实性、完整性进行验证,通过验证公钥证书实现对通信主体的身份验证。
密钥管理:密钥是保密系统中更为脆弱而重要的环节,公钥密码体制是解决密钥管理工作的有力工具;利用公钥密码体制进行密钥协商和产生,保密通信双方不需要事先共享秘密信息;利用公钥密码体制进行密钥分发、保护、密钥托管、密钥恢复等。
基于公钥密码体制可以实现以上通用功能以外,还可以设计实现以下的系统:安全电子商务系统、电子现金系统、电子选举系统、电子招投标系统、电子彩票系统等。
实际项目中的登陆认证、web api接口调用、支付接口调用等场合经常涉及到:md5、sh、 rsa等算法。各大银行接口中经常使用MD5算法对调用接口参数进行签名防篡改。
1.MD5
(1)MD5定义:
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
(2)MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。
(3)MD5应用场景:
A.一致性验证
MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的“数字指纹”,如果任何人对文件做了任何改动,其MD5值也就是对应的“数字指纹”都会发生变化。
B.数字签名
MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫 readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。
C.安全访问认证
MD5还广泛用于操作系统的登陆认证上,如Unix、各类BSD系统登录密码、数字签名等诸多方面。如在Unix系统中用户的密码是以MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行MD5 Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。
D.缺点与不足:
2014年中国山东大学的王小云教授公布破译了MD5、HAVAL-128、 MD4和RIPEMD算法的报告。通过加速的杂凑与冲撞方法破译了MD5算法。
(4)实践举例:web api调用认证中,客户端和服务端通过相同的公钥对提交参数进行MD5加密,进行验证。
2.RSA:
(1)RSA定义:
RSA为公钥加密体制:
A.乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。
B.甲方获取乙方的公钥,然后用它对信息加密。
C.乙方得到加密后的信息,用私钥解密。
(2)特点:
A.便于理解,使用广泛。
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。
B.缺点与不足:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。
(3) rsa算法举例:
3.1ssh口令登录:
3.2ssh公钥登录:
加密算法的本质,首先是为了对数据进行保密并防止篡改,其次更具有了身份验证的功能。像是你跟女友约定好的话术,这句话一说出来,她就知道是什么意思,并且知道说话的人是你,但任何其他人根本不知道你们在说什么。
根据密钥类型的不同,加密算法分为对称和非对称两种。对称加密系统是指加密和解密均采用同一把密钥,就像上文说到的你和女友的小密文,你们互相对对方说“今天月色很美”,对方就明白意思是“我爱你”。非对称密钥则采取加密钥匙和解密要是不同的方式。
对称加密算法是最常用的加密算法,优势在于算法公开,计算量小,加密效率高。常用的对称加密算法有DES、RC4、AES等。
一、 DES算法的优势及应用场景
定义: DES算法又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。明文按64位进行分组,密钥长64位,其中56位参与DES运算,8位为校验位。
优势: DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。然而它的缺点是分组短、密钥短、密码生命周期短、运算速度较慢。
案例: DES算法最常用的场景是银行业,如银行卡收单,信用卡持卡人的PIN的加密传输,IC卡与POS间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。另外,在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域,DES算法也被广泛应用,以此来实现关键数据的保密。
二、 RC4算法的优势及应用场景
定义: RC4算法作为目前最安全的加密算法之一,在1987年被RSA三人组中的头号人物罗纳德所创建。密钥长度是可变的,可变范围为1-256字节(8-2048比特),但一般为256字节。
优势: RC4算法的特点是算法简单,运行速度快,该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非线性。
案例: RC4算法的运用很广泛,起初是用于保护商业机密,到上世纪九十年代,其算法被发布在互联网中,扩大了使用范围。App开发平台APICloud将RC4算法用于代码加密功能,开发者在平台中编译时可选择这个功能,自动为Html、Javascript、Css代码加密,同时该App在运行过程中实时解密,App退出即焚,不留下解密痕迹。APICloud代码加密功能不改变代码量大小,不影响运行效率,针对代码的加密方案不会修改开发者的任何代码,加密后的代码不会比加密前多出一个字节,同时,APICloud在端底层嵌入了特殊的处理方案,保证代码加密前后,App的运行效率、使用体验不受影响。
APICloud采取先进的动态加解密算法在“二进制”级别进行对称加密,编译一次,仅生效一次,保证了代码的安全,防止代码被反编译,被篡改,被窃取数据,被盗版,保护知识产权。APICloud这项加密技术一经推出,切实的为APICloud的开发者解决了代码加密的问题,使开发者更放心,更专心。
三、 AES算法的优势及应用场景
定义: AES算法是高级加密标准的缩写,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
优势: AES具有比DES更好的安全性、效率、灵活性,在软件及硬件上都能快速地加解密,相对来说较易于实作,且只需要很少的存储器。
案例: 使用AES算法最著名的是英特尔处理器,也就是说我们每一个人的电脑里都用到了AES算法进行加密。英特尔内含的AES指令集包含六条指令,据英特尔介绍,AES指令集让至强处理器更加灵活、高效而安全,E7处理器可提速4倍。
四、 常用加密算法的对比
这么多种对称加密算法,那它们之间的区别是什么呢?
总结一下,无论选择哪种加密算法,最终都是为了保证程序员的代码安全,捍卫自己的产品原创性。最后,编程改变世界!
随笔 - 36 文章 - 0 评论 - 110
起因
最近被一个同事问到,在网络交互中,那部分数据需要被加密那一部分不需要被加密。我觉得这个问题有点太泛了,所以给他科普了一次常见的数据加密与应用场景的课。突然间觉得这个还挺有教育意义的。所以我还是吧这个记录一下吧。
啊,年轻犯下的错
当初我们给某个建站平台做手机客户端的时候就没有考虑这些事情,现在想想被攻击实在是太简单了。我们当初做的内容其实根本就没有数据加密的防护,所有的内容都是公开的。尴尬尴尬。
前一段时间的钓鱼Wifi是怎么做的
我想讲明白这件事情,你首先得了解一下DNS究竟是怎么工作的。作为一篇数据加密的文章呢,我就不做太多的DNS的介绍,这类介绍应该很多。简单点说,就是通过URL转换为IP的一个步骤。很多时候,连接网络之后,如果你不特殊设置,会遵循路由给你的推荐设置。比如下图,就是我电脑的截图。
当我访问网络的时候,比如说www.taobao.com那么浏览器会首先查询这个地址的IP是啥。中间的查询过程就不描述了,一般会询问道上图中的10.8.8.8这个服务器中,然后返回淘宝的正确IP地址,然后发起协议,获取网页数据。然后展示出来网页。当然这个是正常情况下,如果DNS告诉你的网址并不是正常的网址,比如说有人写的跟淘宝一毛一样的一个网站你也浑然不知道。如果你在他们网页上输入了账号密码,然后提交的话。实际上就把这个消息发送给了这个网站的制作者,达到了钓鱼的目的。对付小白用户这样肯定是一来一个准,不过大部分人在进入这个系统之后就会发现猫腻了,比如说登陆了很多次,明明账号密码都是对的却登陆不上,进入系统之后发现数据不对,比如说,我之前买的东西居然没有之前订单了。一般人就会警觉可能被钓鱼了。然后修改密码。这样钓到账号密码就已经失效了。
怎么来做一个简单高效,不容易被发现的钓鱼Wifi
怎么叫做个简单呢?就是我不用去架设各式各样的假网站,我可以直接截获真网站的各条网络协议。当然了如果路由器支持这是非常方便的事情。不过我对于这种事情并没有设么研究,咱是一个程序员。咱们考虑的当然是怎么用咱的程序解决这个问题。比如说通过反向代理某些网站,比如说反向代理淘宝。你访问我的代理跟你直接访问淘宝是一样的结果。然后我在我的代理上绑定淘宝的域名。当然了,这样做一般是没有效果的,因为访问淘宝的请求不会到我这边来,因为DNS解析并不是指向我的。但是如果这个路由器是我的,那么,我就可以让访问淘宝的请求指向我。这样一来,我就建设好了一个域名是淘宝内容也是淘宝的代理服务器,我就能拿到你所有的网络请求。这只是一个架构设想,千万别拿来做坏事,咱们只讨论技术。其实就是网络请求的截取,我们也只是简单的讨论这一种还有很多很多请求截获手段,我们就不讨论了。
怎么进行攻击防御
这个命题就变成了
怎么让攻击者拿到你的网络请求,却没有什么用
起因中也介绍了,这是一个跟一个同事讨论引起的帖子,那么,我先贴上他当时回答。他说数据加密就可以了呀。可是数据加密分很多种呀,你觉得那种数据加密在这个场景下会奇效呢?他说MD5、对称加密、非对称加密。实际上这个地方只有一种数据加密是有效的。来,让我们来分析一下哪个是有效的。
MD5
在用户密码的处理中这是一种非常常见的处理方式(尽管MD5从严格意义上来说并不属于一种加密算法,他是将内容提取样本到一个字符串。因为之前在做项目的时候,用户密码都是用这个处理的,所以作者也误认为这是一种加密算法。被多位网友热情指出,尽管他并不是一种加密算法,但是还是把他放到这里吧。因为文章已经写完了。我有懒得改,就这样吧)。但是在登陆场景下这种数据加密方式并不常用。如果使用MD5来进行登录,一般情况需要将用户密码 + 当前时间分钟戳,然后算出一个密文提交给服务器,服务器拿到信息之后,将密码 + 当前时间和当前时间的前后各一分钟算出三个结果。如果客户端提交的数据在三个数据之中,那么就登陆成功,否则就登陆失败。不过这种用法比较局限性。如果你想连用户名都隐去,这种方式是做不到的。
对称加密
首先得了解对称加密是什么,对称加密是加密解密用同一个密钥。前端在加密的时候,你肯定要在前端输出一边明文密钥。那么传送的是什么。找到你的密钥之后,你传送的数据不论是什么都可以直接进行解密。
非对称加密
这才是正规改用的方式,在服务器上公开公钥。客户端、Web页面拿到公钥之后。将内容加密,然后传送给服务器,服务器进行数据解密。这样的话,就算是被人拿到你的信息,也不怕你的数据泄露了。因为没有地方公开私钥,只有服务器自己知道。这样你的账号密码就可以得到有效的保护。
那么加密的时候,我都需要怎么处理呢?
或许你会这么想,如果我数据都要加密那得多累?服务器能够受的了吗?如果只是登陆部分进行加密,那么其他的连接信息怎么保证用户信息不背泄露呢?会不会存在特殊情况呢?这几种加密方式都什么时候会用的到呢?
举个例子
登陆
前面我们已经讲过了,有两种实现方式MD5+时间戳。或者非对称是加密方式。
注册
这个恐怕只能用非对称加密算法了。因为你得让服务器知道账号密码的原始内容,却不能让截获者知道。
其他需要身份认证的协议
一般情况下,我们的身份认证是通过一个Token(其实这个东西不一定存在什么地方,有的时候是放到Body里边的有的时候是放到Cookie的,有时候是放到Head里的,放到什么地方不重要,关键是他的意义)来做的。那么保护好这个Token就非常重要了,因为你的Token一旦被别人抓到了。那么你的消息也就泄露了。其实这个比用户名、密码来的还要更加麻烦一些。因为用户名密码你需要拿到原始明文才算数。但是Token不一样。他直接使用密文也是一样的,因为服务器解密之后会发现你上传来的数据是对的。关于这个,有几种方式来处理来让Token失效,这个一会我们在讲。
其实聊天中也比较常用
其实非对称式加密,聊天的过程中用的更多。你想,你的聊天不希望其他人看到的吧。因为毕竟这个是你的隐私呀。所以一般是两个客户端互持对方公钥,然后发送消息。不过如果传送对象是一个群,你需要发送消息给每个人。如果这个群里边有200个人,那么你需要将内容压缩成200种密文然后发送吗?那也忒费劲了。好在我们还有对称加密,我们可以首先使用非对称加密的方式,将对称加密的密钥发送给个个人,然后将内容通过对称加密加密,然后发送给个个人,让他们用之前的对称加密的密钥解密,就可以完美的解决这个问题。当然了,对于大点的内容也是一样的。因为非对称加密的性能是比不上对称加密的。
日防夜防,家贼难防
其实很多时候,自己人是比较难搞的。比如说密码的问题吧。早期的网站很多时候,账号密码就是明文的(安全意识不强,当然了早期嘛,谁都会犯错)。这个时候运营打开自家数据库。那么所有的账号密码那是一览无余呀。这种时候只能靠运营的节操来保证数据不会被偷了。就算是运营不会自己偷这部分数据。但是你要知道,总有一些黑客能够偷偷溜进服务器,偷了一块数据库。如果你有加密(不可逆加密)的话,就算拿到数据库也是没有什么用的,因为密码那一栏被干掉了。这样保证最起码,账号密码不会同时被盗。话说我的所有账号密码都基本上是一套,一套掉了,基本上全套都得换,这是意见非常恐怖的事情。(因为场景用的多了,难免会有一些你想不到,没有去改的,却给你带来比较严重的后果)
怎么让Token失效
服务器端更换密钥
因为密钥更换了,所以所有的加密使用原来公钥加密的数据都会失效。所以可以达到更换Token的目的。不过这样的确定十分明显,因为你是在同一个时间点上换的,所以所有数据都会失效,然后重新拉取凭证。这个时候服务器压力应该会很大。再一个就是没什么用,因为攻击者可以在失败之后直接获取一个新的有效Token就可以了。
客户端服务器数据协同
就是让服务器跟客户端数据保持时间上的一致性,一般情况下要求保持分钟数据相同就可以了。这样客户端算出来自己的Token + 时间分钟戳的密文,然后发送给服务器。服务器接收到密文不需要解密(因此这种是使用不可逆加密算法更为靠谱),直接算出三个结果 (Token + 当前时间和Token + 当前前后各一分钟的时间)判定用户上传的数据是否属于这三个之一,如果是属于就通过,不属于就不通过。
客户端的每一个Token都是不一样的
客户端(或者Web网页)用自己的Token + 当前的时间戳(假定不会再同一时间上有多个请求,时间戳可以定的单位更小一些或者进行排队)生成一个密文,然后发送给服务器。服务器拿到密文之后解密,获取并验证Token如果Token通过了就看时间戳是不是在上一个时间戳之后。如果不是在上一个时间戳之后,那么就验证失败好了。
后记
可能比较乱这个,我也是想到什么地方,就写到什么地方。欢迎在下方评论。
说明
MD5其实并不能算作是一种加密算法,因为加密算一半要牵扯到解密。MD5是一种摘要算法,就是从大数据块中摘取特征码的一种算法。文中将他作为一种不可逆的加密算法来看待,当然这是不准确的一种说法,望周知
js动态生成二维码
https://www.cnblogs.com/zhengweijie/p/6911834.html
import QRCode from 'qrcode' ;
let QueryDetail='http://www.kspxzx.com/#/guard';
var canvas = document.getElementById('canvas')
QRCode.toCanvas(canvas, QueryDetail, function (error) {
if (error) console.error(error)
console.log('success!');
})
这个时候生成的二维码在微信中长安没任何反应,因为qrcode生成的是canvas标签而不是img标签
4.将canvas标签转换为img标签
//从 canvas 提取图片 image
function convertCanvasToImage(canvas) {
//新Image对象,可以理解为DOM
var image = new Image();
// canvas.toDataURL 返回的是一串Base64编码的URL,当然,浏览器自己肯定支持
// 指定格式 PNG
image.src = canvas.toDataURL("image/png");
return image;
}
//获取网页中的canvas对象
var mycanvas1=document.getElementsByTagName('canvas')[0];
//将转换后的img标签插入到html中
var img=convertCanvasToImage(mycanvas1);
$('#imagQrDiv').append(img);//imagQrDiv表示你要插入的容器id