Java 密码加盐

只对密码进行md5加密很容易反推出来,另外两个用户的密码相同时,数据库保存相同的密码。
解决方法是在用户的短密码后面加上一段长字符,再计算 md5,这样反推出原始密码就变得非常困难,而且即使两个用户密码相同,数据库保存的密码也不一样。加上的这段长字符,称为盐(Salt),通过这种方式加密的结果,称为 加盐 Hash。

使用例子:
假设有两个用户admin和abc,密码都为123456,注册时,盐取用户名+一个MD5值。
最终计算出来的密码不一样。

package com.example.shiro;

import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.util.ByteSource;

public class TestPasswordSalt {
    public static void main(String[] args) {
        String pwd1 = md5("123456", "admin8d78869f470951332959580424d4bf4f");
        System.out.println(pwd1);        //密码:d3c59d25033dbf980d29554025c23a75
        String pwd2 = md5("123456", "abc0c23e95fd137ea96c4ef24366b7e6f1f");
        System.out.println(pwd2);        //密码:ae8bb0dd40e4eddeac081f8e31afdaed
    }

    public static final String md5(String password, String salt){
        //加密方式
        String hashAlgorithmName = "MD5";
        //盐:相同密码使用不同的盐加密后的结果不同
        ByteSource byteSalt = ByteSource.Util.bytes(salt);
        //密码
        Object source = password;
        //加密次数
        int hashIterations = 2;
        SimpleHash result = new SimpleHash(hashAlgorithmName, source, byteSalt, hashIterations);
        return result.toString();
    }
}

数据库表字段保存见下面表,登录后取用户名+salt进行验证。

username password salt
admin d3c59d25033dbf980d29554025c23a75 8d78869f470951332959580424d4bf4f
abc ae8bb0dd40e4eddeac081f8e31afdaed 0c23e95fd137ea96c4ef24366b7e6f1f

原文地址:https://www.cnblogs.com/gdjlc/p/12052083.html

时间: 2024-11-08 11:43:01

Java 密码加盐的相关文章

密码加盐

import java.security.MessageDigest;import java.util.Random; import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin; /** * @fileName Md5PasswordUtil.java * @Description 明文密码加密加盐操作 * 1:生成加密密码:首先使用randomSalt获取随机盐值,并保存;再将随机盐值和明文密码传入generate生成加密密文

实体字符转换,同样变量密码加盐MD5后生成的加密字符串不同解决办法 (原)

我是首次登录系统自动生成一个密码,格式大概是:   abcd1234&  这种格式 , 比如加密规则就是一个 MD5() 然后,首次账号密码登录,输入密码 abcd1234&,一直提示密码错误,我输出了一下MD5('bacd1234&')值,然后拿出数据库MD5的字符串比较,就是不一样,但是我生成随机密码后加密是没问题的. 问题出在: var_dump() 一下,我们登录表单提交的密码,和我们系统生成的密码字符串,会发现一模一样的字符串,类型也都是string,但是长度不一样,因为

[转]加盐hash保存密码的正确方式

0x00 背景 大多数的web开发者都会遇到设计用户账号系统的需求.账号系统最重要的一个方面就是如何保护用户的密码.一些大公司的用户数据库泄露事件也时有发生,所以我们必须采取一些措施来保护用户的密码,即使网站被攻破的情况下也不会造成较大的危害.保护密码最好的的方式就是使用带盐的密码hash(salted password hashing).对密码进行hash操作是一件很简单的事情,但是很多人都犯了错.接下来我希望可以详细的阐述如何恰当的对密码进行hash,以及为什么要这样做. 0x01 重要提醒

密码的加盐加密

我们 所 使用密码的加密方式 大多为md5 加密  但是一些不法分子 利用 云计算 分布式计算 可以暴力破解我们的密码 我们通过 加入盐值的方式 加密 密码使得密码 不会被轻易破解 1 //对密码进行加盐加密 2 $password = $this->data['password']; 3 //生成盐值 随机生成几个字符串 4 $altToken = md5(String::randString(10)); 5 //加入盐值 6 $password = md5($password.$altTok

使用nodeJS的 crypto模块来为你的密码hash加盐

这篇文章将向你解释如何使用Node.js的Crypto模块对你的密码进行加盐hash.在这里,我们将不会对不懂的密码存储方式进行详细的比较.我们将要做的是知道在Node.js中使用加盐hash在进行密码存储的机制.放心,这是最好的存储密码的方式,在没有出现其他更好的方法之前. 这是什么技术 加盐是这样一直技术:将用户输入的密码和一个随机的字符串(这个字符串就是盐)通过hash结合,通过hash算法生成一个hash值,然后将结果存储在数据库中. 为什么要进行加盐Hash 因为相同密码的hash值是

MD5加密加盐

Java实现MD5的随机加盐加密,这样以来就很难解密了,必须使用原密码才能正常的登录系统了,以下为Java实现的MD5随机加盐加密,以及使用Apache的Hex类实现Hex(16进制字符串和)和字节数组的互转: 1 package com.dq.online.onlinezuul.util; 2 3 import org.apache.commons.codec.binary.Hex; 4 5 import java.security.MessageDigest; 6 import java.u

Shiro___加密加盐迭代

简单的模拟账号密码登入,为了简便就不去数据库真实的查询了 这里先使用MD5加盐迭代加密,算出我们的密码加密结果 MD5是不可逆的,单向加密,所以我们需要对原始数据进行加密后与加密的数据对比,而不是去解密 package com.test; import org.apache.shiro.crypto.hash.Md5Hash; /** * 对123456加密, * 盐值(salt):zsl * 迭代次数:6 * 加密结果:70fc2a964652cf72d7f67022a7951e51 * @a

了解Java密码扩展的基础

  了解Java密码扩展的基础     Java密码扩展(The Java Cryptography Extension),是JDK1.4的一个重要部分,基本上,他是由一些包构成的,这些包形成了一个框架并实现了一些加密,密钥生成算法和协议,消息认证码等算法,这篇文章将想你介绍JCE的安装和使用.    值得注意的是,尽管JCE是JDK1.4的核心包的一部分,我们将首先用JDK1.2及高一点的版本向你演示一下如何安装配置JCE(静态安装).稍后,将向你介绍如何在不安装的情况下使用JCE(动态安装)

(转)浅谈MD5加密算法中的加盐值(SALT)

我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码. 加Salt可以一定程度上解决这一问题.所谓加Salt方法,就是加点“佐料”.其基本想法是这样的:当用户首次提供密码时(通常是注册时),由系统自动往这个密码里撒一些“佐料”,然后再散列.而当用户登录时,系统为用户提供的代码撒上同样的“佐料”,然后散列,再比较散列值,已确定密码是否正确. 这里的“佐料”被称作“Salt值”,这个值是由系统随机生成的,并且只有系统