网站像素大小,神起网络游戏推广平台,网站建设设计收费,字节跳动广告代理商加盟目录
前言
什么是MD5#xff1f;#xff1f; 加盐算法
那别的人会不会跟你得到相同的UUID#xff1f;
如何使用盐加密#xff1f;
代码实现 前言 对于我们常见的登录的时候需要用到的组件#xff0c;加密是一个必不可少的东西#xff0c;如果我们往数据库存放用户…目录
前言
什么是MD5 加盐算法
那别的人会不会跟你得到相同的UUID
如何使用盐加密
代码实现 前言 对于我们常见的登录的时候需要用到的组件加密是一个必不可少的东西如果我们往数据库存放用户的密码是直接以明文存储的话那么数据被窃取的时候损失也就是最大的因为别人可以很直观的看到你的用户数据不需要任何破解成本。 所以我们需要对其加密。 目前最常见的两种数据加密方法 MD5加密加盐算法 什么是MD5 简单来说md5就是讲遗传字符串通过某种特定的算法来将其变化成另外一种形式这样子就从明文的外观变成另外一个样子。但是由于背后的算法格式是固定的所以每一个字符串都有固定的MD5格式。 有的用户为了方便记忆把密码设置成简单的有规律的字母或者数字组合有的也喜欢使用单独一个单词这种举一个简单的例子例如密码1234567和密码1726354这两种密码因为格式简单很容易就被一次一次的试出来也就是被暴力破解。 然后我们使用1234567进行MD5加密但是这样就会让数据完全处于安全状态吗 具体如何破解也就是讲得到的讲得到的密码进行MD5转换成为对应的哈希然后于最初的哈希进行比对要是匹配那么这个密码就已经暴露给别人了 MD5底层存在一张彩虹表几乎标记了所有字符串的MD5对照表。 有了彩虹表MD5就相当于是不存在了因为一种字符串就只有一种特定的MD5格式 加盐算法 什么是盐 其实盐就是一个随机值没有任何规律通过UUID.randomUUID()来生成一个唯一盐值。这个uuid是唯一的具体唯一就是根据你的mac地址等内容生成的一个世界唯一的值 那别的人会不会跟你得到相同的UUID 下面的内容来自百度百科 官方说明产生错误的情况非常低是故大可不必考虑这个重复的问题 如何使用盐加密 这里存在一个合约公式也就是盐值32位 $ MD5加密后的密码 加密思路用户输入一个明文密码通过UUID得到一个盐值这段密码首先使用MD5和盐值进行一个基本的加密然后使用合约公式将盐值和使用MD5盐值生成的合约公式存入数据库 如何解密这里的解密不是指的直接将我们得到的合约公式又解密成明文比如用户想要登录于是他输入了他之前设置的密码。这个密码被后端得到之后就会进行验证具体就是首先记住这个明文然后通过数据库中存储的对应用户的合约公式拿出来通过$来获取盐值然后将用户输入的明文和拿到的盐值进行MD5加密然后再合成一个 盐值32位 $ MD5加密盐值用户输入的密码 那么现在就有两个合约公式了一个是用户注册时候生成的一个是用户刚刚输入的后台自动生成的合约公式 如果两个合约公式是一样的那么就说明现在正在登录这个账户的人是这个账户的持有者就可以允许访问 代码实现 在实现这个功能之前你需要引入一个工具类可以前往maven下载地址为
dependencygroupIdcommons-codec/groupIdartifactIdcommons-codec/artifactIdversion1.14/version !--根据需要选择合适版本--
/dependency
代码案例
import org.apache.commons.codec.digest.DigestUtils;public class Main {public static void main(String[] args) {String input Hello World; // 输入字符串// 计算MD5值String md5Hash DigestUtils.md5Hex(input);System.out.println(MD5 Hash: md5Hash);}
}
根据上面的案例进行加密
// import org.apache.commons.codec.digest.DigestUtils;
//
// import java.util.UUID;
public static String encrypt(String password) {// 首先生产一个盐值// UUID.randomUUID() 会生成32位数字然后4位‘-’我们不需要关注‘-’在盐值的什么位置我们只需要去除它String salt UUID.randomUUID().toString();System.out.println(salt);// 去除‘-’salt salt.replaceAll(-,);// 然后使用盐值和传进来的密码进行md5加密String saltPassowrd DigestUtils.md5Hex((saltpassword).getBytes());// 然后和盐值进行拼接然后返回String finalPassword salt $ saltPassowrd;return finalPassword;}
}
解密 解密的思路就是讲用户输入的密码重新进行一次加密然后比对从数据库中拿到的是不是一样的 public static boolean check(String inputPassword, String finalPassword){//首先判断这两个参数到底有没有值并且判断数据库中拿到的finalPassword的length是否为65if (inputPassword null || inputPassword.isEmpty()) {// 这里先判断为不为空是因为后面的isEmpty的前提是字符串不为null不然就会发生空指针异常return false;}if (finalPassword null || finalPassword.isEmpty() || finalPassword.length() ! 65) {return false;}// 从finalPassword中拿到盐值String salt finalPassword.split(\\$)[0];String saltPassword DigestUtils.md5Hex((saltinputPassword).getBytes());String ret salt $ saltPassword;if (ret.equals(finalPassword)) {return true;}return false;}