密码加密的方式有哪些-冯金伟博客园

本教程操作环境:windows7系统、DELL G3电脑

作为一名Web开发人员,我们经常需要与用户的帐号系统打交道,而这其中最大的挑战就是如何保护用户的密码。密码是一个网站系统最重要的护盾,如果把网站系统比作城堡,那密码就是城门。关于如何安全的存储密码以及使用何种算法总是有很多的争论:MD5、SHA1,SHA256、PBKDF2,Bcrypt、Scrypt、Argon2、明文??

常见的7种密码加密方式

  我们该采用什么方式来保护用户的密码呢?以下几种方式是常见的密码保存方式:

算法 特点 有效破解方式 破解难度 其它
对称加密 可以解密出明文 获取密钥 需要确保密钥不泄露
单向HASH 不可解密 碰撞、彩虹表
特殊HASH 不可解密 碰撞、彩虹表 需要确保“盐”不泄露
Pbkdf2 不可解密 需要设定合理的参数
BCrypt 不可解密 需要设定合理的参数
SCrypt 不可解密 需要设定合理的参数
Argon2 不可解密 难+

1、使用对称加密算法来保存

使用情况: ★★☆☆☆

  比如3DES、AES等算法,使用这种方式加密是可以通过解密来还原出原始密码的,当然前提条件是需要获取到密钥。不过既然大量的用户信息已经泄露了,密钥很可能也会泄露,当然可以将一般数据和密钥分开存储、分开管理,但要完全保护好密钥也是一件非常复杂的事情,所以这种方式并不是很好的方式。

#mermaid-svg-biP6VWlRGibFEX5h {font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-biP6VWlRGibFEX5h .error-icon{fill:#552222;}#mermaid-svg-biP6VWlRGibFEX5h .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-biP6VWlRGibFEX5h .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-biP6VWlRGibFEX5h .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-biP6VWlRGibFEX5h .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-biP6VWlRGibFEX5h .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-biP6VWlRGibFEX5h .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-biP6VWlRGibFEX5h .marker{fill:#333333;stroke:#333333;}#mermaid-svg-biP6VWlRGibFEX5h .marker.cross{stroke:#333333;}#mermaid-svg-biP6VWlRGibFEX5h svg{font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-biP6VWlRGibFEX5h .label{font-family:”trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-biP6VWlRGibFEX5h .cluster-label text{fill:#333;}#mermaid-svg-biP6VWlRGibFEX5h .cluster-label span{color:#333;}#mermaid-svg-biP6VWlRGibFEX5h .label text,#mermaid-svg-biP6VWlRGibFEX5h span{fill:#333;color:#333;}#mermaid-svg-biP6VWlRGibFEX5h .node rect,#mermaid-svg-biP6VWlRGibFEX5h .node circle,#mermaid-svg-biP6VWlRGibFEX5h .node ellipse,#mermaid-svg-biP6VWlRGibFEX5h .node polygon,#mermaid-svg-biP6VWlRGibFEX5h .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-biP6VWlRGibFEX5h .node .label{text-align:center;}#mermaid-svg-biP6VWlRGibFEX5h .node.clickable{cursor:pointer;}#mermaid-svg-biP6VWlRGibFEX5h .arrowheadPath{fill:#333333;}#mermaid-svg-biP6VWlRGibFEX5h .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-biP6VWlRGibFEX5h .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-biP6VWlRGibFEX5h .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-biP6VWlRGibFEX5h .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-biP6VWlRGibFEX5h .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-biP6VWlRGibFEX5h .cluster text{fill:#333;}#mermaid-svg-biP6VWlRGibFEX5h .cluster span{color:#333;}#mermaid-svg-biP6VWlRGibFEX5h p.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-biP6VWlRGibFEX5h :root{–mermaid-font-family:”trebuchet ms”,verdana,arial,sans-serif;}

对称加密

明文

密文

#mermaid-svg-Yd8QoxqEgInkZ0dv {font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Yd8QoxqEgInkZ0dv .error-icon{fill:#552222;}#mermaid-svg-Yd8QoxqEgInkZ0dv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Yd8QoxqEgInkZ0dv .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Yd8QoxqEgInkZ0dv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Yd8QoxqEgInkZ0dv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Yd8QoxqEgInkZ0dv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Yd8QoxqEgInkZ0dv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Yd8QoxqEgInkZ0dv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Yd8QoxqEgInkZ0dv .marker.cross{stroke:#333333;}#mermaid-svg-Yd8QoxqEgInkZ0dv svg{font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Yd8QoxqEgInkZ0dv .label{font-family:”trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Yd8QoxqEgInkZ0dv .cluster-label text{fill:#333;}#mermaid-svg-Yd8QoxqEgInkZ0dv .cluster-label span{color:#333;}#mermaid-svg-Yd8QoxqEgInkZ0dv .label text,#mermaid-svg-Yd8QoxqEgInkZ0dv span{fill:#333;color:#333;}#mermaid-svg-Yd8QoxqEgInkZ0dv .node rect,#mermaid-svg-Yd8QoxqEgInkZ0dv .node circle,#mermaid-svg-Yd8QoxqEgInkZ0dv .node ellipse,#mermaid-svg-Yd8QoxqEgInkZ0dv .node polygon,#mermaid-svg-Yd8QoxqEgInkZ0dv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Yd8QoxqEgInkZ0dv .node .label{text-align:center;}#mermaid-svg-Yd8QoxqEgInkZ0dv .node.clickable{cursor:pointer;}#mermaid-svg-Yd8QoxqEgInkZ0dv .arrowheadPath{fill:#333333;}#mermaid-svg-Yd8QoxqEgInkZ0dv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Yd8QoxqEgInkZ0dv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Yd8QoxqEgInkZ0dv .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Yd8QoxqEgInkZ0dv .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Yd8QoxqEgInkZ0dv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Yd8QoxqEgInkZ0dv .cluster text{fill:#333;}#mermaid-svg-Yd8QoxqEgInkZ0dv .cluster span{color:#333;}#mermaid-svg-Yd8QoxqEgInkZ0dv p.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Yd8QoxqEgInkZ0dv :root{–mermaid-font-family:”trebuchet ms”,verdana,arial,sans-serif;}

对称解密

密文

明文

2、使用MD5、SHA1等单向HASH算法保护密码

使用情况: ★★★☆☆

  使用这些算法后,无法通过计算还原出原始密码,而且实现比较简单,因此很多互联网公司都采用这种方式保存用户密码,曾经这种方式也是比较安全的方式,但随着彩虹表技术的兴起,可以建立彩虹表进行查表破解,目前这种方式已经很不安全了。

#mermaid-svg-PhUH3HjBVcURKO8J {font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PhUH3HjBVcURKO8J .error-icon{fill:#552222;}#mermaid-svg-PhUH3HjBVcURKO8J .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PhUH3HjBVcURKO8J .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-PhUH3HjBVcURKO8J .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PhUH3HjBVcURKO8J .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PhUH3HjBVcURKO8J .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PhUH3HjBVcURKO8J .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PhUH3HjBVcURKO8J .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PhUH3HjBVcURKO8J .marker.cross{stroke:#333333;}#mermaid-svg-PhUH3HjBVcURKO8J svg{font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PhUH3HjBVcURKO8J .label{font-family:”trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-PhUH3HjBVcURKO8J .cluster-label text{fill:#333;}#mermaid-svg-PhUH3HjBVcURKO8J .cluster-label span{color:#333;}#mermaid-svg-PhUH3HjBVcURKO8J .label text,#mermaid-svg-PhUH3HjBVcURKO8J span{fill:#333;color:#333;}#mermaid-svg-PhUH3HjBVcURKO8J .node rect,#mermaid-svg-PhUH3HjBVcURKO8J .node circle,#mermaid-svg-PhUH3HjBVcURKO8J .node ellipse,#mermaid-svg-PhUH3HjBVcURKO8J .node polygon,#mermaid-svg-PhUH3HjBVcURKO8J .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PhUH3HjBVcURKO8J .node .label{text-align:center;}#mermaid-svg-PhUH3HjBVcURKO8J .node.clickable{cursor:pointer;}#mermaid-svg-PhUH3HjBVcURKO8J .arrowheadPath{fill:#333333;}#mermaid-svg-PhUH3HjBVcURKO8J .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PhUH3HjBVcURKO8J .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PhUH3HjBVcURKO8J .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-PhUH3HjBVcURKO8J .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-PhUH3HjBVcURKO8J .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PhUH3HjBVcURKO8J .cluster text{fill:#333;}#mermaid-svg-PhUH3HjBVcURKO8J .cluster span{color:#333;}#mermaid-svg-PhUH3HjBVcURKO8J p.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PhUH3HjBVcURKO8J :root{–mermaid-font-family:”trebuchet ms”,verdana,arial,sans-serif;}

HASH算法

明文

密文

#mermaid-svg-o0HmtD7977UNtnmR {font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-o0HmtD7977UNtnmR .error-icon{fill:#552222;}#mermaid-svg-o0HmtD7977UNtnmR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-o0HmtD7977UNtnmR .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-o0HmtD7977UNtnmR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-o0HmtD7977UNtnmR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-o0HmtD7977UNtnmR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-o0HmtD7977UNtnmR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-o0HmtD7977UNtnmR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-o0HmtD7977UNtnmR .marker.cross{stroke:#333333;}#mermaid-svg-o0HmtD7977UNtnmR svg{font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-o0HmtD7977UNtnmR .label{font-family:”trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-o0HmtD7977UNtnmR .cluster-label text{fill:#333;}#mermaid-svg-o0HmtD7977UNtnmR .cluster-label span{color:#333;}#mermaid-svg-o0HmtD7977UNtnmR .label text,#mermaid-svg-o0HmtD7977UNtnmR span{fill:#333;color:#333;}#mermaid-svg-o0HmtD7977UNtnmR .node rect,#mermaid-svg-o0HmtD7977UNtnmR .node circle,#mermaid-svg-o0HmtD7977UNtnmR .node ellipse,#mermaid-svg-o0HmtD7977UNtnmR .node polygon,#mermaid-svg-o0HmtD7977UNtnmR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-o0HmtD7977UNtnmR .node .label{text-align:center;}#mermaid-svg-o0HmtD7977UNtnmR .node.clickable{cursor:pointer;}#mermaid-svg-o0HmtD7977UNtnmR .arrowheadPath{fill:#333333;}#mermaid-svg-o0HmtD7977UNtnmR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-o0HmtD7977UNtnmR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-o0HmtD7977UNtnmR .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-o0HmtD7977UNtnmR .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-o0HmtD7977UNtnmR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-o0HmtD7977UNtnmR .cluster text{fill:#333;}#mermaid-svg-o0HmtD7977UNtnmR .cluster span{color:#333;}#mermaid-svg-o0HmtD7977UNtnmR p.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-o0HmtD7977UNtnmR :root{–mermaid-font-family:”trebuchet ms”,verdana,arial,sans-serif;}

无法还原

密文

明文

3、特殊的单向HASH算法

使用情况: ★★★☆☆

  由于单向HASH算法在保护密码方面不再安全,于是有些公司在单向HASH算法基础上进行了加盐、多次HASH等扩展,这些方式可以在一定程度上增加破解难度,对于加了“固定盐”的HASH算法,需要保护“盐”不能泄露,这就会遇到“保护对称密钥”一样的问题,一旦“盐”泄露,根据“盐”重新建立彩虹表可以进行破解,对于多次HASH,也只是增加了破解的时间,并没有本质上的提升。

#mermaid-svg-NfSmGcuQV1dDZWgk {font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NfSmGcuQV1dDZWgk .error-icon{fill:#552222;}#mermaid-svg-NfSmGcuQV1dDZWgk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NfSmGcuQV1dDZWgk .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-NfSmGcuQV1dDZWgk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NfSmGcuQV1dDZWgk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NfSmGcuQV1dDZWgk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NfSmGcuQV1dDZWgk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NfSmGcuQV1dDZWgk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NfSmGcuQV1dDZWgk .marker.cross{stroke:#333333;}#mermaid-svg-NfSmGcuQV1dDZWgk svg{font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NfSmGcuQV1dDZWgk .label{font-family:”trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-NfSmGcuQV1dDZWgk .cluster-label text{fill:#333;}#mermaid-svg-NfSmGcuQV1dDZWgk .cluster-label span{color:#333;}#mermaid-svg-NfSmGcuQV1dDZWgk .label text,#mermaid-svg-NfSmGcuQV1dDZWgk span{fill:#333;color:#333;}#mermaid-svg-NfSmGcuQV1dDZWgk .node rect,#mermaid-svg-NfSmGcuQV1dDZWgk .node circle,#mermaid-svg-NfSmGcuQV1dDZWgk .node ellipse,#mermaid-svg-NfSmGcuQV1dDZWgk .node polygon,#mermaid-svg-NfSmGcuQV1dDZWgk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NfSmGcuQV1dDZWgk .node .label{text-align:center;}#mermaid-svg-NfSmGcuQV1dDZWgk .node.clickable{cursor:pointer;}#mermaid-svg-NfSmGcuQV1dDZWgk .arrowheadPath{fill:#333333;}#mermaid-svg-NfSmGcuQV1dDZWgk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NfSmGcuQV1dDZWgk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NfSmGcuQV1dDZWgk .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-NfSmGcuQV1dDZWgk .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-NfSmGcuQV1dDZWgk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NfSmGcuQV1dDZWgk .cluster text{fill:#333;}#mermaid-svg-NfSmGcuQV1dDZWgk .cluster span{color:#333;}#mermaid-svg-NfSmGcuQV1dDZWgk p.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NfSmGcuQV1dDZWgk :root{–mermaid-font-family:”trebuchet ms”,verdana,arial,sans-serif;}

HASH算法

盐+明文

密文

#mermaid-svg-Q6G1unqeFmdwtYoP {font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Q6G1unqeFmdwtYoP .error-icon{fill:#552222;}#mermaid-svg-Q6G1unqeFmdwtYoP .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Q6G1unqeFmdwtYoP .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Q6G1unqeFmdwtYoP .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Q6G1unqeFmdwtYoP .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Q6G1unqeFmdwtYoP .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Q6G1unqeFmdwtYoP .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Q6G1unqeFmdwtYoP .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Q6G1unqeFmdwtYoP .marker.cross{stroke:#333333;}#mermaid-svg-Q6G1unqeFmdwtYoP svg{font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Q6G1unqeFmdwtYoP .label{font-family:”trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Q6G1unqeFmdwtYoP .cluster-label text{fill:#333;}#mermaid-svg-Q6G1unqeFmdwtYoP .cluster-label span{color:#333;}#mermaid-svg-Q6G1unqeFmdwtYoP .label text,#mermaid-svg-Q6G1unqeFmdwtYoP span{fill:#333;color:#333;}#mermaid-svg-Q6G1unqeFmdwtYoP .node rect,#mermaid-svg-Q6G1unqeFmdwtYoP .node circle,#mermaid-svg-Q6G1unqeFmdwtYoP .node ellipse,#mermaid-svg-Q6G1unqeFmdwtYoP .node polygon,#mermaid-svg-Q6G1unqeFmdwtYoP .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Q6G1unqeFmdwtYoP .node .label{text-align:center;}#mermaid-svg-Q6G1unqeFmdwtYoP .node.clickable{cursor:pointer;}#mermaid-svg-Q6G1unqeFmdwtYoP .arrowheadPath{fill:#333333;}#mermaid-svg-Q6G1unqeFmdwtYoP .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Q6G1unqeFmdwtYoP .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Q6G1unqeFmdwtYoP .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Q6G1unqeFmdwtYoP .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Q6G1unqeFmdwtYoP .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Q6G1unqeFmdwtYoP .cluster text{fill:#333;}#mermaid-svg-Q6G1unqeFmdwtYoP .cluster span{color:#333;}#mermaid-svg-Q6G1unqeFmdwtYoP p.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Q6G1unqeFmdwtYoP :root{–mermaid-font-family:”trebuchet ms”,verdana,arial,sans-serif;}

无法还原

密文

明文

4、PBKDF2

使用情况: ★★★★☆

  该算法原理大致相当于在HASH算法基础上增加随机盐,并进行多次HASH运算,随机盐使得彩虹表的建表难度大幅增加,而多次HASH也使得建表和破解的难度都大幅增加。使用PBKDF2算法时,HASH算法一般选用sha1或者sha256,随机盐的长度一般不能少于8字节,HASH次数至少也要1000次,这样安全性才足够高。一次密码验证过程进行1000次HASH运算,对服务器来说可能只需要1ms,但对于破解者来说计算成本增加了1000倍,而至少8字节随机盐,更是把建表难度提升了N个数量级,使得大批量的破解密码几乎不可行,该算法也是美国国家标准与技术研究院推荐使用的算法。

  PBKDF2 已经存在很长时间了,像之前文章讨论的一样,它有点过时了:轻松的在多核系统(GPU)上实现并行,这对于定制系统(FPGA/ASIC)来说微不足道。

#mermaid-svg-xRdA6xcxiKqBcLEX {font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-xRdA6xcxiKqBcLEX .error-icon{fill:#552222;}#mermaid-svg-xRdA6xcxiKqBcLEX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xRdA6xcxiKqBcLEX .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-xRdA6xcxiKqBcLEX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xRdA6xcxiKqBcLEX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xRdA6xcxiKqBcLEX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xRdA6xcxiKqBcLEX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xRdA6xcxiKqBcLEX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xRdA6xcxiKqBcLEX .marker.cross{stroke:#333333;}#mermaid-svg-xRdA6xcxiKqBcLEX svg{font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xRdA6xcxiKqBcLEX .label{font-family:”trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-xRdA6xcxiKqBcLEX .cluster-label text{fill:#333;}#mermaid-svg-xRdA6xcxiKqBcLEX .cluster-label span{color:#333;}#mermaid-svg-xRdA6xcxiKqBcLEX .label text,#mermaid-svg-xRdA6xcxiKqBcLEX span{fill:#333;color:#333;}#mermaid-svg-xRdA6xcxiKqBcLEX .node rect,#mermaid-svg-xRdA6xcxiKqBcLEX .node circle,#mermaid-svg-xRdA6xcxiKqBcLEX .node ellipse,#mermaid-svg-xRdA6xcxiKqBcLEX .node polygon,#mermaid-svg-xRdA6xcxiKqBcLEX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xRdA6xcxiKqBcLEX .node .label{text-align:center;}#mermaid-svg-xRdA6xcxiKqBcLEX .node.clickable{cursor:pointer;}#mermaid-svg-xRdA6xcxiKqBcLEX .arrowheadPath{fill:#333333;}#mermaid-svg-xRdA6xcxiKqBcLEX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xRdA6xcxiKqBcLEX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xRdA6xcxiKqBcLEX .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-xRdA6xcxiKqBcLEX .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-xRdA6xcxiKqBcLEX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xRdA6xcxiKqBcLEX .cluster text{fill:#333;}#mermaid-svg-xRdA6xcxiKqBcLEX .cluster span{color:#333;}#mermaid-svg-xRdA6xcxiKqBcLEX p.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xRdA6xcxiKqBcLEX :root{–mermaid-font-family:”trebuchet ms”,verdana,arial,sans-serif;}

多次HASH算法

随机盐+明文

密文

#mermaid-svg-WPZZSunyY9QGmqft {font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WPZZSunyY9QGmqft .error-icon{fill:#552222;}#mermaid-svg-WPZZSunyY9QGmqft .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WPZZSunyY9QGmqft .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-WPZZSunyY9QGmqft .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WPZZSunyY9QGmqft .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WPZZSunyY9QGmqft .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WPZZSunyY9QGmqft .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WPZZSunyY9QGmqft .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WPZZSunyY9QGmqft .marker.cross{stroke:#333333;}#mermaid-svg-WPZZSunyY9QGmqft svg{font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WPZZSunyY9QGmqft .label{font-family:”trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-WPZZSunyY9QGmqft .cluster-label text{fill:#333;}#mermaid-svg-WPZZSunyY9QGmqft .cluster-label span{color:#333;}#mermaid-svg-WPZZSunyY9QGmqft .label text,#mermaid-svg-WPZZSunyY9QGmqft span{fill:#333;color:#333;}#mermaid-svg-WPZZSunyY9QGmqft .node rect,#mermaid-svg-WPZZSunyY9QGmqft .node circle,#mermaid-svg-WPZZSunyY9QGmqft .node ellipse,#mermaid-svg-WPZZSunyY9QGmqft .node polygon,#mermaid-svg-WPZZSunyY9QGmqft .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WPZZSunyY9QGmqft .node .label{text-align:center;}#mermaid-svg-WPZZSunyY9QGmqft .node.clickable{cursor:pointer;}#mermaid-svg-WPZZSunyY9QGmqft .arrowheadPath{fill:#333333;}#mermaid-svg-WPZZSunyY9QGmqft .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WPZZSunyY9QGmqft .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WPZZSunyY9QGmqft .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-WPZZSunyY9QGmqft .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-WPZZSunyY9QGmqft .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WPZZSunyY9QGmqft .cluster text{fill:#333;}#mermaid-svg-WPZZSunyY9QGmqft .cluster span{color:#333;}#mermaid-svg-WPZZSunyY9QGmqft p.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:”trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WPZZSunyY9QGmqft :root{–mermaid-font-family:”trebuchet ms”,verdana,arial,sans-serif;}

无法还原

密文

明文

5、BCrypt

使用情况: ★★★★☆

  BCrypt 在1999年就产生了,并且在对抗 GPU/ASIC 方面要优于 PBKDF2,但是我还是不建议你在新系统中使用它,因为它在离线破解的威胁模型分析中表现并不突出。 尽管有一些数字加密货币依赖于它(即:NUD),但它并没有因此获得较大的普及,因此,FPGA/ASIC 社区也并没有足够的兴趣来构建它的硬件实现。 话虽如此,Solar Designer(OpenWall)、Malvoni 和 Knezovic(萨格勒布大学)在 2014 年撰写了一篇论文,这篇文章描述了一种混合使用 ARM/FPGA 的单片系统来攻击该算法。

6、SCrypt

使用情况: ★★★★☆

  SCrypt 在如今是一个更好的选择:比 BCrypt设计得更好(尤其是关于内存方面)并且已经在该领域工作了 10 年。另一方面,它也被用于许多加密货币,并且我们有一些硬件(包括 FPGA 和 ASIC)能实现它。 尽管它们专门用于采矿,也可以将其重新用于破解。

7、Argon2

使用情况: ★★★★★

  Argon2 基于 AES 实现,现代的 x64 和 ARM 处理器已经在指令集扩展中实现了它,从而大大缩小了普通系统和攻击者系统之间的性能差距,

  Argon2 有三个主要的版本:

  • Argon2i 是对抗侧信道攻击的最安全选择,Argon2i 使用与数据无关的内存访问,这是密码哈希的首选方法,Argon2i 对内存进行了更多的传递,以防止权衡攻击的发生。
  • Argon2d 是抵抗 GPU 破解攻击的最安全选择,并且Argon2 在 2015 年 7 月赢得了密码哈希竞赛。Argon2d 使用依赖数据的内存访问,这使得它很适合用于加密数字货币和工作量证明的应用程序,而不会受到侧信道定时攻击的威胁。
  • Argon2id 在内存第一次迭代的前半部分充当 Argon2i,其余部分则充当 Argon2d。因此,基于时间、 空间的平衡,它既提供了侧信道攻击保护也节约了暴力开销。

  如果你担心侧信道攻击(例如:恶意数据缓存加载/幽灵漏洞,它允许通过基于缓存的侧信道读取同一硬件上其他正在运行的进程的私有内存数据),你应该使用 Argon2i,否则使用 Argon2d。 如果你不确定或你对混合方法感到满意,你可以使用 Argon2id 来获得两个方面的优势。

  源代码可以在 Github 上获得,使用兼容 C89 的 C 语言编写,并在知识共享许可协议下获取许可,并且可以在大多数 ARM、x86 和 x64 架构的硬件上编译。

温馨提醒

  在2019 年之后,就有相关专家提出建议尽量不要使用 PBKDF2 或 BCrypt,并强烈建议将 Argon2(最好是 Argon2id)用于最新系统。而Scrypt 是当 Argon2 不可用时的不二选择,但要记住,它在侧侧信道泄露方面也存在相同的问题。

更多相关知识,请访问常见问题栏目!

以上就是密码加密的方式有哪些的详细内容,更多请关注风君子博客其它相关文章!