常用加密算法 + 盐值

1.生成盐值

public static String getSalt() throws NoSuchAlgorithmException {
        // Use a SecureRandom generator, SHA1PRNG算法是基于SHA-1实现且保密性较强的随机数生成器
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        // Create array for salt
        byte[] salt = new byte[16];
        // Get a random salt
        secureRandom.nextBytes(salt);
        // 将十进制数转换成十六进制(使用&运算,正数部分没变,负数部分二进制从右往左第9位及以上都为0
        StringBuilder builder = new StringBuilder();
        for (byte num : salt) {
            builder.append(Integer.toString((num & 0xff) + 0x100, 16).substring(1));
        }
        return builder.toString();
    }

2.最简单的MD5(唾弃,了解一下即可)

public static String getSimpleMD5Code(String password) {
        try {
            // Create MessageDigest instance for MD5
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            // digest(byte[] input)使用指定的byte数组对摘要进行最后更新,然后完成摘要计算,此方法首先调用
            // update(input),向update方法传递input数组,然后调用digest()。
            byte[] bytes = md5.digest(password.getBytes()); // 如有中文,须添加字符集
            StringBuilder builder = new StringBuilder();
            for (byte num : bytes) {
                builder.append(Integer.toString((num & 0xff) + 0x100, 16).substring(1));
            }
            return builder.toString();
        } catch (NoSuchAlgorithmException e) {
            System.out.println("algorithm wrong");
            return null;
        }
    }

3.MD5+盐值(安全要求较低可以用)

 public static String getMD5WithSaltCode(String password, String salt) {
        try {
            // Create MessageDigest instance for MD5
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            // Get password mix salt,可以做多种组合,增加原始密码长度、复杂度
            password = salt + password + salt;
            // digest(byte[] input)使用指定的byte数组对摘要进行最后更新,然后完成摘要计算,此方法首先调用
            // update(input),向update方法传递input数组,然后调用digest()。
            byte[] bytes = md5.digest(password.getBytes()); // 如有中文,须添加字符集
            StringBuilder builder = new StringBuilder();
            for (byte num : bytes) {
                builder.append(Integer.toString((num & 0xff) + 0x100, 16).substring(1));
            }
            return builder.toString();
        } catch (NoSuchAlgorithmException e) {
            System.out.println("algorithm wrong");
            return null;
        }
    }

4.使用SHA家族(中级安全,比MD家族强)

public static String getSHACode(String password, String salt, String algorithm) {
        // algorithm加密算法可选SHA-1/SHA-256/SHA-384/SHA-512
        try {
            MessageDigest md = MessageDigest.getInstance(algorithm);
            // Get password mix salt,可以做多种组合,增加原始密码长度、复杂度
            password = salt + password + salt;
            // digest(byte[] input)使用指定的byte数组对摘要进行最后更新,然后完成摘要计算,此方法首先调用
            // update(input),向update方法传递input数组,然后调用digest()。
            byte[] bytes = md.digest(password.getBytes()); // 如有中文,须添加字符集
            StringBuilder builder = new StringBuilder();
            for (byte num : bytes) {
                builder.append(Integer.toString((num & 0xff) + 0x100, 16).substring(1));
            }
            return builder.toString();
        } catch (NoSuchAlgorithmException e) {
            System.out.println("algorithm wrong");
            return null;
        }
    }

5.PBKDF2,安全性较高,比上述的强

 public static String getPBKDF2Code(String password, String salt) {
        // 迭代次数,可依情况修改
        int interNum = 10000;
        PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), interNum, 128 * 4);//128位16进制字符
        // PBKDF2算法应用很广泛,大多数数据库支持该算法,可用于到处密钥,也可用于口令保存
        try {
            // SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");  使用PBKDF2WithHmacSHA1
            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
            byte[] bytes = secretKeyFactory.generateSecret(spec).getEncoded();
            StringBuilder builder = new StringBuilder();
            for (byte num : bytes) {
                builder.append(Integer.toString((num & 0xff) + 0x100, 16).substring(1));
            }
            return builder.toString();
        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
            System.out.println("algorithm wrong");
            return null;
        }
    }

你可能感兴趣的:(常用加密算法 + 盐值)