对重要数据进行MD5保护

摘要:最近后端学习中涉及使用MD5算法保存密码数据,简单记录以备后续查阅!

        有些重要数据的存储往往需要考虑安全风险,例如密码明文,为增强安全性可对密码使用md5算法进行保护。

MD5(Message-Digest Algorithm 5是一种广泛使用的摘要算法,用于生成消息摘要以验证消息的完整性。MD5 算法的输入是一个字符串,输出是一个128位的二进制字符串。

        MD5 算法的原理是通过对输入字符串进行一系列的变换,将字符串转换为一个固定长度的摘要。这些变换包括:

  1. 将字符串转换为二进制数;
  2. 将二进制数补齐为128位;
  3. 对二进制数进行位运算,包括异或、与、左移等;
  4. 将运算结果转换为十六进制字符串。

        MD5 算法的优点是简单、高效、易于实现,但存在一些安全问题,如碰撞攻击、哈希碰撞等。因此,在实际应用中,MD5 算法已经逐渐被 SHA-1、SHA-256 等更安全的摘要算法所取代,这几种算法也可借鉴MD5的实现来处理。

        MD5加密的实现如下,使用字符串Constant.SALT(盐)来增加加密的复杂度和安全性:

/**
 * 描述: MD5工具
 */
public class MD5Utils {
    // 工具类使用static定义可方便其他类调用
    public static String getMD5Str(String strValue) throws NoSuchAlgorithmException {
        MessageDigest md5= MessageDigest.getInstance("MD5");
        // 字符串和常量Constant.SALT拼接成新的字符串。调用getBytes()方法将该字符串转换为字节数组
        return Base64.encodeBase64String(md5.digest((strValue+ Constant.SALT).getBytes()));
    }

    //用这个方法测试生成的md5的值
    public static void main(String[] args) {
        String md5=null;
        try {
            md5 = getMD5Str("1234");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        System.out.println(md5);
    }
}

Constant.java
/**
 * 常量值
 * 为增强算法破解难度,使用常量字符串加盐
 */
public class Constant {
    public static final String SALT ="8svbsvjkweDF,.03[";
}

        上述代码,MessageDigest.getInstance()方法用于获取指定算法类型的MessageDigest实例。MessageDigest是一个抽象类,它提供了加密散列算法的实现,如MD5、SHA-1、SHA-256等。MessageDigest.getInstance()方法接收一个算法名称作为参数,例如"MD5"、"SHA-1"等。该方法会根据提供的算法名称创建一个MessageDigest实例,并返回该实例。如果提供的算法名称无效,该方法将抛出一个NoSuchAlgorithmException异常。

 MessageDigest(消息摘要算法)是一种加密散列算法,用于确保数据的完整性。在计算机领域,消息摘要通常用于验证数据是否被篡改、确保数据的完整性以及防止未经授权的访问。这些算法可以将数据转换为摘要字符串,以便于验证数据的完整性。

       对于需要存储到数据库的重要数据,调用MD5Utils.getMD5Str()方法先加密再存储,过程如下:

// 写到数据库
User user = new User();
user.setUsername(userName);
// 数据库存储的密码需要加密,则先使用MD5工具类MD5Utils加密后再存储
try {
    user.setPassword(MD5Utils.getMD5Str(password));
} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
}

你可能感兴趣的:(初入后端,数据库,后端,密码学,java)