安全哈希算法1年代trong>SHA-1是由美国政府标准机构国家标准与技术协会(NIST)于1993年开发的。它广泛应用于安全应用程序和协议,包括<一个href="//www.parkandroid.com/wiki/tls/?wiki_title=TLS" class="wiki_link new" title="TLS" target="_blank" rel="nofollow">TLS一个>,<一个href="//www.parkandroid.com/wiki/ssl/" class="wiki_link" title="SSL" target="_blank">SSL一个>,<一个href="//www.parkandroid.com/wiki/pgp/?wiki_title=PGP" class="wiki_link new" title="PGP" target="_blank" rel="nofollow">PGP一个>,<一个href="//www.parkandroid.com/wiki/ssh/?wiki_title=SSH" class="wiki_link new" title="SSH" target="_blank" rel="nofollow">SSH一个>,<一个href="//www.parkandroid.com/wiki/ipsec/?wiki_title=IPsec" class="wiki_link new" title="IPsec" target="_blank" rel="nofollow">IPsec一个>,<一个href="//www.parkandroid.com/wiki/smime/?wiki_title=S/MIME" class="wiki_link new" title="S / MIME" target="_blank" rel="nofollow">S / MIME一个>.
SHA-1通过将消息作为<一个href="//www.parkandroid.com/wiki/binary-numbers/" class="wiki_link" title="位串" target="_blank">位串一个>长度小于<年代pan class="katex">
2年代pan>6年代pan>4年代pan>位,并产生一个160位的哈希值称为消息摘要.注意,下面的消息表示为<一个href="//www.parkandroid.com/wiki/hexadecimal-numbers/" class="wiki_link" title="十六进制" target="_blank">十六进制一个>简洁的符号。
使用SHA-1加密消息有两种方法。尽管其中一种方法节省了64个32位单词的处理,但执行起来更加复杂和耗时,因此简单的方法如下例所示。在执行结束时,算法输出16个单词的块,其中每个单词由16位组成,总共256位。
伪代码年代trong>
假设消息' abc '将使用SHA-1进行编码,其中消息' abc '以二进制表示
0年代pan>1年代pan>1年代pan>0年代pan>0年代pan>0年代pan>0年代pan>1年代pan>0年代pan>1年代pan>1年代pan>0年代pan>0年代pan>0年代pan>1年代pan>0年代pan>0年代pan>1年代pan>1年代pan>0年代pan>0年代pan>0年代pan>1年代pan>1年代pan>
这就是我的意思
6年代pan>1年代pan>6年代pan>2年代pan>6年代pan>3.年代pan>.年代pan>
1)年代trong>第一步是初始化五个随机的十六进制字符串,它们将作为哈希函数的一部分(如十六进制所示):
H年代pan>0年代pan>H年代pan>1年代pan>H年代pan>2年代pan>H年代pan>3.年代pan>H年代pan>4年代pan>=年代pan>6年代pan>7年代pan>D年代pan>E年代pan>2年代pan>一个年代pan>0年代pan>1年代pan>=年代pan>B年代pan>B年代pan>0年代pan>3.年代pan>E年代pan>2年代pan>8年代pan>C年代pan>=年代pan>0年代pan>1年代pan>1年代pan>E年代pan>F年代pan>1年代pan>D年代pan>C年代pan>=年代pan>9年代pan>2年代pan>9年代pan>3.年代pan>E年代pan>9年代pan>E年代pan>2年代pan>=年代pan>C年代pan>D年代pan>E年代pan>F年代pan>2年代pan>3.年代pan>一个年代pan>9年代pan>.年代pan>
2)年代trong>那么信息就是<一个href="//www.parkandroid.com/wiki/padding/" class="wiki_link" title="垫" target="_blank">垫一个>通过添加一个1,后面跟着足够的0,直到消息是448位。然后将64位表示的消息长度添加到末尾,生成一个512位长的消息:
字符串"abc"的填充位,最终由字符串的长度确定,该长度为24位。年代pan>
3)年代trong>上面得到的填充输入,<年代pan class="katex">
米年代pan>,然后被分成512位的块,每个块又被分成16个32位的单词,<年代pan class="katex">
W年代pan>0年代pan>...年代pan>W年代pan>1年代pan>5年代pan>.在' abc '的情况下,只有一个块,因为消息总数小于512位。
4)年代trong>对于每个块,开始80次迭代,<年代pan class="katex">
我年代pan>,是哈希所必需的(80是SHA-1的确定数字),并对每个块执行以下步骤,<年代pan class="katex">
米年代pan>n年代pan>:年代pan>
- 对于迭代16到79,其中<年代pan class="katex">
1年代pan>6年代pan>≤年代pan>我年代pan>≤年代pan>7年代pan>9年代pan>,执行以下操作:<年代pan class="katex-display">
W年代pan>(年代pan>我年代pan>)年代pan>=年代pan>年代年代pan>1年代pan>(年代pan>W年代pan>(年代pan>我年代pan>−年代pan>3.年代pan>)年代pan>⊕年代pan>W年代pan>(年代pan>我年代pan>−年代pan>8年代pan>)年代pan>⊕年代pan>W年代pan>(年代pan>我年代pan>−年代pan>1年代pan>4年代pan>)年代pan>⊕年代pan>W年代pan>(年代pan>我年代pan>−年代pan>1年代pan>6年代pan>)年代pan>)年代pan>,年代pan>XOR的地方,或者<年代pan class="katex">
⊕年代pan>,用以下输入的比较表示<年代pan class="katex">
x年代pan>而且<年代pan class="katex">
y年代pan>:年代pan>
x年代pan> |
y年代pan> |
输出 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
- 例如,当<年代pan class="katex">
我年代pan>是16,选的词都是<年代pan class="katex">
W年代pan>(年代pan>1年代pan>3.年代pan>)年代pan>,年代pan>W年代pan>(年代pan>8年代pan>)年代pan>,年代pan>W年代pan>(年代pan>2年代pan>)年代pan>,年代pan>W年代pan>(年代pan>0年代pan>)年代pan>,输出为一个新词,<年代pan class="katex">
W年代pan>(年代pan>1年代pan>6年代pan>)年代pan>,所以执行XOR,或者<年代pan class="katex">
⊕年代pan>,对这些词的操作将得到:
W年代pan>(年代pan>0年代pan>)年代pan> |
0年代pan>1年代pan>1年代pan>0年代pan>0年代pan>0年代pan>0年代pan>1年代pan>0年代pan>1年代pan>1年代pan>0年代pan>0年代pan>0年代pan>1年代pan>0年代pan>0年代pan>1年代pan>1年代pan>0年代pan>0年代pan>0年代pan>1年代pan>1年代pan>1年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan> |
W年代pan>(年代pan>2年代pan>)年代pan> |
0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan> |
W年代pan>(年代pan>8年代pan>)年代pan> |
0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan> |
W年代pan>(年代pan>1年代pan>3.年代pan>)年代pan> |
0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan> |
|
⊕年代pan> |
W年代pan>(年代pan>1年代pan>6年代pan>)年代pan> |
0年代pan>1年代pan>1年代pan>0年代pan>0年代pan>0年代pan>0年代pan>1年代pan>0年代pan>1年代pan>1年代pan>0年代pan>0年代pan>0年代pan>1年代pan>0年代pan>0年代pan>1年代pan>1年代pan>0年代pan>0年代pan>0年代pan>1年代pan>1年代pan>1年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan> |
循环移位操作年代trong>
现在,循环移位运算<年代pan class="katex">
年代年代pan>n年代pan>(年代pan>X年代pan>)年代pan>这个词<年代pan class="katex">
X年代pan>通过<年代pan class="katex">
n年代pan>位,<年代pan class="katex">
n年代pan>作为一个介于<年代pan class="katex">
0年代pan>而且<年代pan class="katex">
3.年代pan>2年代pan>,定义为
年代年代pan>n年代pan>(年代pan>X年代pan>)年代pan>=年代pan>(年代pan>X年代pan><年代pan><年代pan>n年代pan>)年代pan>或年代pan>(年代pan>X年代pan>>年代pan>>年代pan>3.年代pan>2年代pan>−年代pan>n年代pan>)年代pan>,年代pan>
在哪里<年代pan class="katex">
X年代pan><年代pan><年代pan>n年代pan>是<年代trong>左移年代trong>运算,通过丢弃最左边得到<年代pan class="katex">
n年代pan>位的<年代pan class="katex">
X年代pan>并填充结果<年代pan class="katex">
n年代pan>右边是0。
X年代pan>>年代pan>>年代pan>3.年代pan>2年代pan>−年代pan>n年代pan>是<年代trong>右移年代trong>通过丢弃最右边得到的运算<年代pan class="katex">
n年代pan>位的<年代pan class="katex">
X年代pan>并填充结果<年代pan class="katex">
n年代pan>左边是0。因此<年代pan class="katex">
年代年代pan>n年代pan>(年代pan>X年代pan>)年代pan>等价于<年代pan class="katex">
X年代pan>通过<年代pan class="katex">
n年代pan>位置,在本例中使用了圆形左移。<年代up>[3]一个>年代up>
左移<年代pan class="katex">
年代年代pan>n年代pan>(年代pan>W年代pan>(年代pan>我年代pan>)年代pan>)年代pan>,年代pan>在哪里<年代pan class="katex">
W年代pan>(年代pan>我年代pan>)年代pan>是<年代pan class="katex">
1年代pan>0年代pan>0年代pan>1年代pan>0年代pan>,年代pan>会产生<年代pan class="katex">
0年代pan>1年代pan>0年代pan>0年代pan>1年代pan>,作为最右边的位<年代pan class="katex">
0年代pan>被移到字符串的左侧。因此,<年代pan class="katex">
W年代pan>(年代pan>1年代pan>6年代pan>)年代pan>最终会变成
1年代pan>1年代pan>0年代pan>0年代pan>0年代pan>0年代pan>1年代pan>0年代pan>1年代pan>1年代pan>0年代pan>0年代pan>0年代pan>1年代pan>0年代pan>0年代pan>1年代pan>1年代pan>0年代pan>0年代pan>0年代pan>1年代pan>1年代pan>1年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>0年代pan>.年代pan>
5)年代trong>现在,将第1步定义的哈希值存储在以下变量中:
一个年代pan>B年代pan>C年代pan>D年代pan>E年代pan>=年代pan>H年代pan>0年代pan>=年代pan>H年代pan>1年代pan>=年代pan>H年代pan>2年代pan>=年代pan>H年代pan>3.年代pan>=年代pan>H年代pan>4年代pan>.年代pan>
6)年代trong>为<年代pan class="katex">
8年代pan>0年代pan>迭代,<年代pan class="katex">
0年代pan>≤年代pan>我年代pan>≤年代pan>7年代pan>9年代pan>,计算<年代pan class="katex-display">
T年代pan>E年代pan>米年代pan>P年代pan>=年代pan>年代年代pan>5年代pan>∗年代pan>(年代pan>一个年代pan>)年代pan>+年代pan>f年代pan>(年代pan>我年代pan>;年代pan>B年代pan>,年代pan>C年代pan>,年代pan>D年代pan>)年代pan>+年代pan>E年代pan>+年代pan>W年代pan>(年代pan>我年代pan>)年代pan>+年代pan>K年代pan>(年代pan>我年代pan>)年代pan>.年代pan>关于逻辑函数的详细信息见下面,<年代pan class="katex">
f年代pan>的价值<年代pan class="katex">
K年代pan>(年代pan>我年代pan>)年代pan>.年代pan>重新分配以下变量:
E年代pan>D年代pan>C年代pan>B年代pan>一个年代pan>=年代pan>D年代pan>=年代pan>C年代pan>=年代pan>年代年代pan>3.年代pan>0年代pan>(年代pan>B年代pan>)年代pan>=年代pan>一个年代pan>=年代pan>T年代pan>E年代pan>米年代pan>P年代pan>.年代pan>
7)年代trong>将数据块的哈希结果存储为所有数据块的哈希值,如下所示,并继续执行下一个数据块:
H年代pan>0年代pan>H年代pan>1年代pan>H年代pan>2年代pan>H年代pan>3.年代pan>H年代pan>4年代pan>=年代pan>H年代pan>0年代pan>+年代pan>一个年代pan>=年代pan>H年代pan>1年代pan>+年代pan>B年代pan>=年代pan>H年代pan>2年代pan>+年代pan>C年代pan>=年代pan>H年代pan>3.年代pan>+年代pan>D年代pan>=年代pan>H年代pan>4年代pan>+年代pan>E年代pan>.年代pan>
8)年代trong>作为最后一步,当处理完所有块后,消息摘要表示为由<年代trong>或年代trong>逻辑运算符,<年代pan class="katex">
∨年代pan>5个散列值的值:
H年代pan>H年代pan>=年代pan>年代年代pan>1年代pan>2年代pan>8年代pan>(年代pan>H年代pan>0年代pan>)年代pan>∨年代pan>年代年代pan>9年代pan>6年代pan>(年代pan>H年代pan>1年代pan>)年代pan>∨年代pan>年代年代pan>6年代pan>4年代pan>(年代pan>H年代pan>2年代pan>)年代pan>∨年代pan>年代年代pan>3.年代pan>2年代pan>(年代pan>H年代pan>3.年代pan>)年代pan>∨年代pan>H年代pan>4年代pan>.年代pan>
因此,字符串' abc '将由类似于<年代trong>a9993e364706816aba3e25717850c26c9cd0d89d年代trong>.
例如,如果字符串更改为' abcd ',哈希值将完全不同,因此攻击者无法判断它与原始消息相似。'abcd'的哈希值为<年代trong>81年fe8bfe87576c3ecb22426f8e57847382917acf年代trong>.
算法中使用的函数年代trong>
在SHA-1中使用一系列逻辑函数,取决于的值<年代pan class="katex">
我年代pan>,在那里<年代pan class="katex">
0年代pan>≤年代pan>我年代pan>≤年代pan>7年代pan>9年代pan>,并在三个32位的单词B、C和D上,以产生32位的输出。下面的方程描述了<一个href="//www.parkandroid.com/wiki/truth-tables/" class="wiki_link" title="逻辑函数" target="_blank">逻辑函数一个>,在那里<年代pan class="katex">
¬年代pan>是合乎逻辑的不,<年代pan class="katex">
∨年代pan>是合乎逻辑的或,<年代pan class="katex">
∧年代pan>是合乎逻辑的和,<年代pan class="katex">
⊕年代pan>为逻辑异或:
f年代pan>(年代pan>我年代pan>;年代pan>B年代pan>,年代pan>C年代pan>,年代pan>D年代pan>)年代pan>f年代pan>(年代pan>我年代pan>;年代pan>B年代pan>,年代pan>C年代pan>,年代pan>D年代pan>)年代pan>f年代pan>(年代pan>我年代pan>;年代pan>B年代pan>,年代pan>C年代pan>,年代pan>D年代pan>)年代pan>f年代pan>(年代pan>我年代pan>;年代pan>B年代pan>,年代pan>C年代pan>,年代pan>D年代pan>)年代pan>=年代pan>(年代pan>B年代pan>∧年代pan>C年代pan>)年代pan>∨年代pan>(年代pan>(年代pan>¬年代pan>B年代pan>)年代pan>∧年代pan>D年代pan>)年代pan>=年代pan>B年代pan>⊕年代pan>C年代pan>⊕年代pan>D年代pan>=年代pan>(年代pan>B年代pan>∧年代pan>C年代pan>)年代pan>∨年代pan>(年代pan>B年代pan>∧年代pan>D年代pan>)年代pan>∨年代pan>(年代pan>C年代pan>∧年代pan>D年代pan>)年代pan>=年代pan>B年代pan>⊕年代pan>C年代pan>⊕年代pan>D年代pan>为年代pan>0年代pan>≥年代pan>我年代pan>≥年代pan>1年代pan>9年代pan>为年代pan>2年代pan>0年代pan>≥年代pan>我年代pan>≥年代pan>3.年代pan>9年代pan>为年代pan>4年代pan>0年代pan>≥年代pan>我年代pan>≥年代pan>5年代pan>9年代pan>为年代pan>6年代pan>0年代pan>≥年代pan>我年代pan>≥年代pan>7年代pan>9年代pan>.年代pan>
此外,在公式中使用了一系列常量词,如下面的十六进制所示:
K年代pan>(年代pan>我年代pan>)年代pan>K年代pan>(年代pan>我年代pan>)年代pan>K年代pan>(年代pan>我年代pan>)年代pan>K年代pan>(年代pan>我年代pan>)年代pan>=年代pan>5年代pan>一个年代pan>8年代pan>2年代pan>7年代pan>9年代pan>9年代pan>9年代pan>,年代pan>=年代pan>6年代pan>E年代pan>D年代pan>9年代pan>E年代pan>B年代pan>一个年代pan>1年代pan>,年代pan>=年代pan>8年代pan>F年代pan>1年代pan>B年代pan>B年代pan>C年代pan>D年代pan>C年代pan>,年代pan>=年代pan>C年代pan>一个年代pan>6年代pan>2年代pan>C年代pan>1年代pan>D年代pan>6年代pan>,年代pan>在哪里年代pan>0年代pan>≤年代pan>我年代pan>≤年代pan>1年代pan>9年代pan>在哪里年代pan>2年代pan>0年代pan>≤年代pan>我年代pan>≤年代pan>3.年代pan>9年代pan>在哪里年代pan>4年代pan>0年代pan>≤年代pan>我年代pan>≤年代pan>5年代pan>9年代pan>在哪里年代pan>6年代pan>0年代pan>≤年代pan>我年代pan>≤年代pan>7年代pan>9年代pan>.年代pan>
尽管SHA-1仍然被广泛使用,但2005年的密码分析人员发现了该算法的漏洞,对其安全性造成了不利影响。这些漏洞以一种快速查找算法的形式出现<一个href="//www.parkandroid.com/wiki/collisions/" class="wiki_link" title="碰撞" target="_blank">碰撞一个>使用不同的输入,这意味着两个不同的输入映射到同一个摘要<年代up>[4]一个>年代up>.
截至2010年,许多组织已经建议用SHA-2或SHA-3取代它。微软、谷歌或Mozilla等公司已经宣布,到2017年,他们的浏览器将停止接受SHA-1加密证书<年代up>[5]一个>年代up>.