<commit_before>---
layout: page
title:	密码安全
category: blog
description: 
---
# Preface
本文总结了密码学(cryptography) 中的密码安全与签名安全

# Signature, 签名
MAC(Message Authentication Code) 与 hash 的区别: http://stackoverflow.com/questions/2836100/what-is-the-difference-between-a-hash-and-mac-message-authentication-code

- HASH 验证消息(message)没有被篡改 `hash = hash(message)`
- MAC 不仅验证消息没有被篡改，还通过一个`private key`验证*谁*加密的消息, 用`key` 保证消息真实性 `mac = hash(key + message)`. 
这个key 类似于salt, 但是意义不一样，key 是需要严格保密的, salt 是用于加固弱密的

MAC 是用于身份认证的，并且依靠其中的密钥来防止攻击者篡改消息。如果攻击者无需知道密钥和消息，也能构造出包含`key + message + extra` 的一个有效的哈希值, 也就破解了身份验证。

破解MAC 方法有：
- Length Extension attacks, 长度扩展攻击: 针对普通的md5/sha1/sha2

## Crack MAC, 破解MAC

### Length Extension attacks, 长度扩展攻击 
本节参考：
http://anquan.baidu.com/bbs/thread-117372-1-1.html
http://zh.wikipedia.org/wiki/%E9%95%BF%E5%BA%A6%E6%89%A9%E5%B1%95%E6%94%BB%E5%87%BB

####  Length Extension attacks principle, 长度扩展攻击原理
长度扩展攻击（Length extension attacks）是指针对某些*允许包含额外信息*的加密散列函数的攻击手段。

普通哈希摘要算法，如md5/sha1/sha2，都是基于Merkle–Damgård结构的。
这类结构有一个特点：如果你知道message 的hash 摘要; 只需要再知道message 长度(也可以猜这个长度)，那在message 后面加一些相应的`extra message` 你也能计算出相应的 摘要值。

	h1 = hash(msg)
	h2 = hash(pad(msg) + extra)

也就是你只知道h1，并猜出或者得到msg 长度，就可以算出加extra 后的新摘要h2. 
这是因为这类Merkle–Damgår 结构的摘要算法是以区块为单位的，MD5, SHA1, SHA256的区块长度是512 bits. 

mac 的具体应用场景：给如下的url 加一个md5 签名

	Url: http://hilojack.com?redirect=wiki.hilojack.com
	Origin Signature: 6d5f807e23db210bc254a28be2d6759a0f5f5d99<commit_msg>mysql-index<commit_after>---
layout: page
title:	密码安全
category: blog
description: 
---
# Preface
本文总结了密码学(cryptography) 中的密码安全与签名安全

# Signature, 签名
MAC(Message Authentication Code) 与 hash 的区别: http://stackoverflow.com/questions/2836100/what-is-the-difference-between-a-hash-and-mac-message-authentication-code

- HASH 验证消息(message)没有被篡改 `hash = hash(message)`
- MAC 不仅验证消息没有被篡改，还通过一个`private key`验证*谁*加密的消息, 用`key` 保证消息真实性 `mac = hash(key + message)`. 
这个key 类似于salt, 但是意义不一样，key 是需要严格保密的, salt 是用于加固弱密的

MAC 是用于身份认证的，并且依靠其中的密钥来防止攻击者篡改消息。如果攻击者无需知道密钥和消息，也能构造出包含`key + message + extra` 的一个有效的哈希值, 也就破解了身份验证。

破解MAC 方法主要有：

- Length Extension attacks, 长度扩展攻击: 针对普通的md5/sha1/sha2

## Crack MAC, 破解MAC

### Length Extension attacks, 长度扩展攻击 
本节参考：
http://anquan.baidu.com/bbs/thread-117372-1-1.html
http://zh.wikipedia.org/wiki/%E9%95%BF%E5%BA%A6%E6%89%A9%E5%B1%95%E6%94%BB%E5%87%BB

####  Length Extension attacks principle, 长度扩展攻击原理
长度扩展攻击（Length extension attacks）是指针对某些*允许包含额外信息*的加密散列函数的攻击手段。

普通哈希摘要算法，如md5/sha1/sha2，都是基于Merkle–Damgård结构的。
这类结构有一个特点：如果你知道message 的hash 摘要; 只需要再知道message 长度(也可以猜这个长度)，那在message 后面加一些相应的`extra message` 你也能计算出相应的 摘要值。

	h1 = hash(msg)
	h2 = hash(pad(msg) + extra)

也就是你只知道h1，并猜出或者得到msg 长度，就可以算出加extra 后的新摘要h2. 
这是因为这类Merkle–Damgår 结构的摘要算法是以区块为单位的，MD5, SHA1, SHA256的区块长度是512 bits. 

mac 的具体应用场景：给如下的url 加一个md5 签名

	Url: http://hilojack.com?redirect=wiki.hilojack.com
	Origin Signature: 6d5f807e23db210bc254a28be2d6759a0f5f5d99
{'fraction_non_alphanumeric': 0.12195121951219512, 'fraction_numerical': 0.05358983167296462, 'mean_word_length': 6.4858611825192805, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5888674', 'n_tokens_mistral': 1820, 'n_tokens_neox': 1959, 'n_words': 201}