Hash基础

简介

哈希函数,亦称为哈希算法或散列函数
能给一个任意大小的文件提取指纹。一般情况下,不同文件,哈希函数提取到的指纹是不一样的


Hash作用

  • 文件校验
  • 授权校验
  • 基于口令的加密
  • 消息验证码
  • 数字签名
  • 伪随机数生成器
  • 一次性口令

性质

  • 压缩性
  • 单向性
  • 理论无碰撞性
    • 弱无碰撞性:对于给定的x,要找到一个y,并且满足y!=x且h(x)=h(y),在计算上不可行
    • 强无碰撞性:找到任意一对数(x,y),要满足y!=x且h(x)=h(y),在计算上不可行

加密方式

普通网站

  • md5($str) 此方式使用最多
  • md5($str.$salt)
  • md5($salt.$str)
  • sha1($str)
  • sha1($str.$salt)
  • sha1($salt.$str)

常见CMS后台数据库

  • WordPress:生成用户密码时,随机产生了一个salt,将salt与password相加,进行count次md5,最后和encoded64的hash数值累加,得到一个以P开头的密码
  • Dedecms:32位MD5减去头5位,减去尾7位,得到20位
  • Joomla:MD5($pass.$salt)
  • Vbulletin;IceBB;Discus:MD5(MD5($password).$salt)
  • osCommerce:MD5($salt.pass)
  • TBDev:MD5($salt.$pass.$salt)
  • ipb;mybb:MD5(MD5($salt).MD5($salt))

数据库

例如:
MySQL 4.1版本之前是MySQL323加密,MySQL 4.1和之后的版本都是MySQL SHA1加密
MySQL数据库中自带Old_Password(str)和Password(str)函数,它们均可以MySQL数据库里进行查询,前者是MySQL323加密,后者是MySQL SHA1方式加密

  1. 以MySQL323方式:

    1
    select old_password('123');
  2. 以MySQL SHA1方式:

    1
    select password('123')/SHA-1(SHA-1($pass))

Windows系统

  • LM哈希原理:
  1. 将用户明文转换称大写
  2. 将大写明文转换成16进制,并固定长度位14字节,不足用0x00补齐
  3. 将16进制分为2组,每组7字节
  4. 分别将两组数据,用str_to_key()函数处理,得到两组8字节数据
  5. 两组8字节数据将作为DESKEY对魔术字符串KGS!@#$%进行标准DES加密
  6. 将加密后的这两组数据简单拼接,得到最后的LM Hash
  • NTLM:
    与LM哈希算法相比:
  • 明文口令大小写敏感
  • 无法根据NTLM Hash判断原始明文口令是否小于8字节
  • 摆脱了魔术字符串
  • MD4是真正的单项哈希函数,穷举作为数据源出现的明文,难度较大

Linux系统

其中shadow中存放的密码密文格式形如:

1
$id$salt$encrypted

  • id是指使用的哈希算法,可取如下值:

    1: MD5
    2a:Blowfish(not in mainline glibc;added in some)
    5: SHA-256(since glibc 2.7)
    6: SHA-512(since glibc 2.7)

  • salt是使用上面HASH算法对密码进行HASH的一个干扰值

  • encrypted即密码的Hash

Hash的获取

抓住Hash密文

  1. 通过SQL注入漏洞获取密文(针对web应用)
  2. 嗅探、抓包拦截等获取(针对网络环境)
  3. SAM文件或者内存信息获取(Windows环境)
  4. 以root权限读取shadow文件(Linux环境)

Hash的破解

  1. 在线查找Hash破解
  2. 本地查找Hash破解
  3. 基于SAM文件破解
  4. 基于读取内存信息的破解
  5. 破解Linux口令我呢见
  6. 其它破解工具

补充

彩虹表

您的支持是我前进的动力!