基于盐+Sha算法的安全密码保护机制

  密码通过加盐后,可以增加密码的复杂度,即便最简单的密码,在加盐后,也能变成复杂的字符串,这大大提高了密码破解的难度。但是如果将盐硬编码在程序中或随机一次生成的,每个密码进行hash使用相同的盐会降低系统的防御力,因为相同密码的hash两次后的结果也是一样的。所以比较正确的做法是每次创建用户或修改密码都使用一个新的随机盐

  很多用户可能想到了将用户名作为盐的方案,虽然对于每一个用户来说用户名可能是不同的,但是用户名是可预测的,并不是完全随机的。攻击者完全可以用常见的用户名作为盐来制作查询表和彩虹表破解hash。

  我们通常使用密码学上可靠安全的伪随机数生成器(Cryptographically Secure Pseudo-Random Number Generator (CSPRNG))来生成盐。正如它的名字说明的那样,CSPRNG提供一个高标准的随机数,是完全无法预测的。在Java中,可以使用java.security.SecureRandom生成。

  此外,在web应用中,我们要在服务端进行Hash,而不是客户端。因为如果Hash在客户端的话,即便传输的不是明文,如果恶意的黑客获取了用户的Hash,就可以直接登录帐号了。甚至都不需要知道客户的明文密码,也就不需要破解Hash了。我们需要记得客户端Hash并不是HTTPS的替代品

/**
	 * 获取随机盐
	 * @return
	 */
	public static String getSalt(){
		SecureRandom sr;
	    byte[] salt = new byte[16];
	    try {
	      sr = SecureRandom.getInstance("SHA1PRNG", "SUN");
	      sr.nextBytes(salt);
	    } catch (Exception e) {
	      e.printStackTrace();
	    } 
	    
	    return salt.toString();
	}
/**
	 * sha2 加盐加密
	 * @param encryptStr 需要加密的字符串
	 * @param salt 盐
	 * @return
	 */
	public static String sha2EncryptSalt(String encryptStr, String salt){
		MessageDigest md = null;
        String encryptCode = null;

        byte[] bt = (encryptStr + salt).getBytes();
        try {
            md = MessageDigest.getInstance("SHA-256");
            md.update(bt);
            encryptCode = bytes2Hex(md.digest()); 
        } catch (NoSuchAlgorithmException e) {
            return null;
        }
        return encryptCode;
	}
时间: 2025-01-06 02:11:29

基于盐+Sha算法的安全密码保护机制的相关文章

从新浪微博和MySQL的密码保护机制谈HTTPS/SSL的必要性

虽然业界已经达成共识,在传输用户密码等需要保密的信息时,尽可能采用HTTPS/SSL协议传输.但我们还是可以看到少数没有用HTTPS/SSL加密的网站或应用.新浪微博的登录页面和MySQL是两个例子.接下来我们详细分析它们的密码传输和保存机制. 新浪微博 新浪微博的登录页面的URL是http://www.weibo.com/login.从这可以看出新浪微博的登录页面没有采用HTTPS来传输用户的密码. 如果我们对登录相关的代码感兴趣,我们可以用浏览器的调试功能看到如下图所示的代码: 从这段代码我

【转载】GC基本算法及C++GC机制

原文: GC基本算法及C++GC机制 阅读目录 前言 基本概念 有向可达图与根集 三种基本的垃圾收集算法及其改进算法 1.引用计数算法 2. Mark & Sweep 算法 3. 节点复制算法 分代回收 C++垃圾回收机制 参考书籍 正文 回到顶部 前言 垃圾收集器是一种动态存储分配器,它自动释放程序不再需要的已分配的块,这些块也称为垃圾.在程序员看来,垃圾就是不再被引用的对象.自动回收垃圾的过程则称为垃圾收集(garbage collection).在一个支持垃圾收集的语言中,程序显式地申请内

QT:用QSet储存自定义结构体的问题——QSet和STL的set是有本质区别的,QSet是基于哈希算法的,要求提供自定义==和qHash函数

前几天要用QSet作为储存一个自定义的结构体(就像下面这个程序一样),结果死活不成功... 后来还跑到论坛上问人了,丢脸丢大了... 事先说明:以下这个例子是错误的 [cpp] view plaincopyprint? #include <QtCore> struct node { int cx, cy; bool operator < (const node &b) const { return cx < b.cx; } }; int main(int argc, cha

基于比较的算法之五:堆排序

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法.堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点.通常堆是通过一维数组来实现的.在起始数组为 0 的情形中:父节点i的左子节点在位置 (2*i+1);父节点i的右子节点在位置 (2*i+2);子节点i的父节点在位置 floor((i-1)/2); 在堆的数据结构中,堆中的最大值总是位于根节点.堆中定义以下几种操作:最大堆调整(maxHeapify):将堆的末端子节点作调整

基于朴素贝叶斯分类算法的邮件过滤系统

转自穆晨 阅读目录 前言 准备数据:切分文本 训练并测试 小结 回到顶部 前言 朴素贝叶斯算法最为广泛而经典的应用毫无疑问是文档分类,更具体的情形是邮件过滤系统. 本文详细地讲解一个基于朴素贝叶斯分类算法的邮件过滤系统的具体实现. 本文侧重于工程实现,至于其中很多算法的细节请参考之前的一篇文章:朴素贝叶斯分类算法原理分析与代码实现. 回到顶部 准备数据:切分文本 获取到文本文件之后,首先要做的是两件事情: 1. 将文本文件转换为词汇列表 2. 将上一步的结果进一步转换为词向量 对于 1,具体来说

第六篇:基于朴素贝叶斯分类算法的邮件过滤系统

前言 朴素贝叶斯算法最为广泛而经典的应用毫无疑问是文档分类,更具体的情形是邮件过滤系统. 本文详细地讲解一个基于朴素贝叶斯分类算法的邮件过滤系统的具体实现. 本文侧重于工程实现,至于其中很多算法的细节请参考之前的一篇文章:朴素贝叶斯分类算法原理分析与代码实现. 准备数据:切分文本 获取到文本文件之后,首先要做的是两件事情: 1. 将文本文件转换为词汇列表 2. 将上一步的结果进一步转换为词向量 对于 1,具体来说,就是将文本文件以非字母或数字之外的字符为界进行切割. 仅仅使用字符串的 split

python模块之hashlib: md5和sha算法

hashlib是个专门提供hash算法的库,现在里面包括md5, sha1, sha224, sha256, sha384, sha512,使用非常简单.方便.    md5经常用来做用户密码的存储.而sha1则经常用作数字签名.下面看看代码吧: #-*- encoding:gb2312 -*-import hashliba = "a test string"print hashlib.md5(a).hexdigest()print hashlib.sha1(a).hexdigest(

图像检索:基于形状特征的算法

本文节选自<基于形状特征的图像检索算法研究> 基于形状特征的图像检索算法相对于颜色特征和纹理特征来说,使用的稍微少一些.摘录了其中的几种算法,不做深入剖析了. 形状通常与图像中的特定目标对象有关,是人们的视觉系统对目标的最初认识,有一定的语义信息,被认为是比颜色特征和纹理特征更高一层的特征.形状描述的准确与否是决定图像检索算法优劣的重要因素,一个好的形状描述符应具备独特性.完备性.几何不变性.灵活性以及抽象性.形状的描述符大体可以分为两大类:第一类是描述形状目标区域边界轮廓的像素集合,称为基于

【常用算法】KDTree,局部敏感哈希LSH,在基于最近邻的算法中,当N特别大的时候(TODO)

基于最近邻的算法,在各种情况下经常使用, 比如10万个用户,对每一个用户分别查找最相似的用户, 当N特别大的时候,效率就不是很高,比如当N=10^5,时已经不太好算了,因为暴力法时间复杂度为O(N^2). 故需要特殊的手段,这里有两个常用的方法, 一个是KDT树(还有Ball Tree),一个是局部敏感哈希(近似算法,得到得是满足一定置信区间的结果) KDT: O(N*longN) 局部敏感哈希(LSH):跟桶大小有关 1#  K-Dimensional Tree,KDT, https://en