Skip to content

Instantly share code, notes, and snippets.

@gcdd1993
Created November 1, 2021 08:16
Show Gist options
  • Save gcdd1993/1df6099036b59bf89e049f180256eed8 to your computer and use it in GitHub Desktop.
Save gcdd1993/1df6099036b59bf89e049f180256eed8 to your computer and use it in GitHub Desktop.
kotlin 中使用md5加盐算法
package com.reorigin.tabby.hivemq.util
import org.slf4j.LoggerFactory
import java.math.BigInteger
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException
/**
* md5工具类
*
* @author gcdd1993
*/
object Md5Utils {
private val log = LoggerFactory.getLogger(javaClass)
private val hexDigits = charArrayOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F')
private val hexDigitsLower = charArrayOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f')
/**
* 对字符串 MD5 加盐值加密
*
* @param plainText 传入要加密的字符串
* @param saltValue 传入要加的盐值
* @return MD5加密后生成32位(小写字母+数字)字符串
*/
fun md5Lower(plainText: String, saltValue: String): String? {
return try {
// 获得MD5摘要算法的 MessageDigest 对象
val md = MessageDigest.getInstance("MD5")
// 使用指定的字节更新摘要
md.update(plainText.toByteArray())
md.update(saltValue.toByteArray())
// digest()最后确定返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
// BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值。1 固定值
BigInteger(1, md.digest()).toString(16).padStart(32, '0')
} catch (e: NoSuchAlgorithmException) {
log.error("md5 lower error, plainText = {}, saltValue = {}", plainText, saltValue, e)
null
}
}
/**
* 对字符串 MD5 加盐值加密
*
* @param plainText 传入要加密的字符串
* @param saltValue 传入要加的盐值
* @return MD5加密后生成32位(大写字母+数字)字符串
*/
fun md5Upper(plainText: String, saltValue: String): String? {
return try {
// 获得MD5摘要算法的 MessageDigest 对象
val md = MessageDigest.getInstance("MD5")
// 使用指定的字节更新摘要
md.update(plainText.toByteArray())
md.update(saltValue.toByteArray())
// 获得密文
val mdResult = md.digest()
// 把密文转换成十六进制的字符串形式
val j = mdResult.size
val str = CharArray(j * 2)
var k = 0
for (i in 0 until j) {
val byte0 = mdResult[i]
str[k++] = hexDigits[byte0.toInt() ushr 4 and 0xf]
str[k++] = hexDigits[byte0.toInt() and 0xf]
}
String(str).padStart(32, '0')
} catch (e: Exception) {
e.printStackTrace()
null
}
}
}
@gcdd1993
Copy link
Author

gcdd1993 commented Nov 1, 2021

其中的.padStart(32, '0'),能够解决算出的md5值,缺失前面的0的问题

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment