过去一段时间来, 众多的网站遭遇用户密码数据库泄露事件。层出不穷的类似事件对用户会造成巨大的影响,因为人们往往习惯在不同网站使用相同的密码,一家 “暴库”,全部遭殃。

单向加密

一个简单的方案是将明文密码做单向哈希后存储。

单向哈希算法有一个特性,无法通过哈希后的摘要(digest) 恢复原始数据,这也是 “单向” 二字的来源,这一点和所有的加密算法都不同。常用的单向哈希算法包括 SHA-256, SHA-1, MD5 等。例如,对密码“passwordhunter” 进行 SHA-256 哈希后的摘要 (digest) 如下:

“bbed833d2c7805c4bf039b140bec7e7452125a04efa9e0b296395a9b95c2d44c”

可能是 “单向” 二字有误导性,也可能是上面那串数字唬人,不少人误以为这种方式很可靠, 其实不然。

单向哈希有两个特性:

1)从同一个密码进行单向哈希,得到的总是唯一确定的摘要

2)计算速度快。随着技术进步,尤其是显卡在高性能计算中的普及,一秒钟能够完成数十亿次单向哈希计算

结合上面两个特点,考虑到多数人所使用的密码为常见的组合,攻击者可以将所有密码的常见组合进行单向哈希,得到一个摘要组合, 然后与数据库中的摘要进行比对即可获得对应的密码。这个摘要组合也被称为 rainbow table(彩虹表)。

更糟糕的是,一个攻击者只要建立上述的rainbow table,可以匹配所有的密码数据库。仍然等同于一家 “暴库”,全部遭殃。

加盐哈希

将明文密码混入 “随机因素 “,然后进行单向哈希后存储,也就是所谓的”Salted Hash(加盐哈希)”。

这个方式相比上面的方案,最大的好处是针对每一个数据库中的密码,都需要建立一个完整的 rainbow table 进行匹配。因为两个同样使用 “passwordhunter”作为密码的账户,在数据库中存储的摘要完全不同。

在 C# 中实现加盐哈希

早在2016年,MD5 作为哈希算法已经不可靠,可以人为制造碰撞,于是本文采用了 SHA256 作为哈希算法。同时在哈希前生成了一个 Guid 作为盐和哈希值拼接在一起:

using System;
using System.Security.Cryptography;
using System.Text;public class PasswordHasher
{public string HashPassword(string password){var rnd = Guid.NewGuid().ToString("N").Substring(10);return BuildHash(rnd, password);}public bool CheckPassword(string password, string hash){if (string.IsNullOrWhiteSpace(hash)){return false;}var items = hash.Split('|');if (items.Length != 2){return false;}var rnd = items[0];return hash == BuildHash(rnd, password);}private string BuildHash(string rnd, string password){var key = rnd + "|" + password.Trim();var hash = Hash(key);return rnd + "|" + hash;}private string Hash(string input){using (var sha = new SHA256CryptoServiceProvider()){var bytes = Encoding.UTF8.GetBytes(input);bytes = sha.ComputeHash(bytes);return Convert.ToBase64String(bytes);}}
}

生成加盐哈希值:

//生成加盐哈希
var hasher = new PasswordHasher();
var pwd = hasher.HashPassword("123456");
Console.WriteLine("加盐哈希值为:{0}",pwd);

校验密码是否匹配:

//校验密码是否匹配
var hasher = new PasswordHasher();
var hash = "89455bb276f037799fea1d|1rcfw+tSKhpG7zuW7Sm6SuMgjafAwsMg76OlyFkXLm8=";
var pwd = "123456";
if (hasher.CheckPassword(pwd, hash))
{Console.WriteLine("密码正确");
}
else
{Console.WriteLine("密码不匹配");
}

一个简单的方式搞定密码的加盐哈希与验证相关推荐

  1. wps流程图导出不清楚_一份清晰的“流程图”,无需专业软件,一个简单Word轻松搞定...

    制作流程图前我们需要三个准备,但当我们所有准备完成后,就是一定要亲自去实操,否则只能是空想,在实际操作时却不知道该从何入手,就好比现在自己需要画一个简单的流程图,应该在哪里操作呢? 一般情况分为两种, ...

  2. 密码加密 加盐 Java PBKDF2 密码哈希代码

    如果你是Web开发者,你很可能需要开发一个用户账户系统.这个系统最重要的方面,就是怎样保护用户的密码.存放帐号的数据库经常成为入侵的目标,所以你必须做点什么来保护密码,以防网站被攻破时发生危险.最好的 ...

  3. 电视linux系统怎么连wifi密码错误,智能电视连不上WIFI不用急,6种简单解决办法搞定!...

    原标题:智能电视连不上WIFI不用急,6种简单解决办法搞定! 现在智能电视已经大范围普及,给我们的客厅娱乐带来的很多便利,但是智能电视在使用过程中经常会遇到各种问题,其中连接WiFi失败的问题最为常见 ...

  4. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin --------- ...

  5. 无广告托管应用,免费的应用分发平台,提供下载次数等数据统计,Android、ios应用合并,一个二维码搞定

    前言 省去自建服务器的麻烦,并且提供了下载次数等数据统计,可以随时查看历史版本,一个二维码搞定Android和ios,扫码时可根据机型自动识别,给开发者提供很大便利,不仅免费而且操作非常的简单. 1. ...

  6. 怎么把线稿提取出来_用ps如何提取线稿图?简单教程轻松搞定

    用ps如何提取线稿图?简单教程轻松搞定!最近有小伙伴问微课菌说:Ps怎么样提取线稿,最好还是种通俗易懂的教程,那么必须安排上啊,今天微课菌就给大家分享一个超级简单的PS快速提取线稿教程!还不会的小伙伴 ...

  7. 历经一个月,终于搞定了SVM(支持向量机)-附源代码解析

    历经一个月,终于搞定了SVM(支持向量机)-附源代码解析 前言 其实整体算下来,断断续续的也得有快两个月了(原谅博主比较笨).中间也有好几次放弃,不想写这篇总结了,但是之前立下的誓言,要将学习到的每一 ...

  8. 三星复印机载体初始化步骤_三星复印机如何恢复默认出厂模式?解决网络打印,简单2步搞定...

    原标题:三星复印机如何恢复默认出厂模式?解决网络打印,简单2步搞定 通过恢复机器的默认出厂模式,我们可以: ①设置固定IP,解决网络打印问题: ②重新设置管理员密码: 如何恢复机器的默认出厂模式?简单 ...

  9. 一款好用的JS插件xm-select【只需要引用一个JS文件就搞定】

    一款好用的JS插件xm-select[只需要引用一个JS文件就搞定] 先上js代码:复制保存直接用 !function(e){var t={};function n(o){if(t[o])return ...

最新文章

  1. zookeeper -- Mac 上 Intellij IDEA 配置 zookeeper(3.5.8) 源码阅读、运行、调试环境
  2. 冰岛试行四天工作制大获成功:每周缩短五小时,生产力没变!
  3. java有参数 无参数方法
  4. poj 1077 Eight(A*)
  5. 【AI视野·今日CV 计算机视觉论文速览 第237期】Thu, 30 Sep 2021
  6. 删除域中不再存在的主机
  7. 传递给系统调用的数据区域太小。 (异常来自 HRESULT:0x8007007A)
  8. 每日算法系列【LeetCode 1363】形成三的最大倍数
  9. ZooKeeper 初体验
  10. 计算机科学顶级国际会议,顶级会议推荐:计算机科学理论会议5条
  11. 攻防世界-Crypto-告诉你个秘密(键盘密码)-ISCC2017
  12. qlv转mp4出来没有画面,无画面,解决方法
  13. 电脑WiFi图标不见了?!怎么办......≡ (▔﹏▔) ≡
  14. SourceTree的简单使用 - 变基(rebase)
  15. OpenSUSE 内核编译教程 (kernel 2.6.x)
  16. DFS+DP搜索斗地主玩家手牌最少出牌次数
  17. VMware vRealize Operations Manager download
  18. gear s3刷android wear,【干货】三星Gear S3/Gear S3 classic 智能手表刷机教程
  19. SaaS在中国信息化市场迅速崛起的“秘密”
  20. 【云和恩墨招聘】这是一份靠谱的招聘需求

热门文章

  1. ant 执行多个构建文件
  2. nowcoder OI 周赛 最后的晚餐(dinner) 解题报告
  3. 解决Maven管理项目update Maven时,jre自动变为1.5
  4. 数据结构(Java)——迭代器和列表的实例
  5. 超棒的在线Bootstrap主题编辑工具 - lollytin
  6. 十个jQuery的幻灯片图片轮播切换插件[转]
  7. 合肥工业大学计算机学院王院长,王青山(合肥工业大学教授)_百度百科
  8. google +按钮_如何禁用或改善Google的Google+集成
  9. laravel graphql php,结合 Laravel 初步学习 GraphQL
  10. 绘制三维散点图_SPSS统计作图教程:三维散点图