Created
November 1, 2021 08:16
-
-
Save gcdd1993/1df6099036b59bf89e049f180256eed8 to your computer and use it in GitHub Desktop.
kotlin 中使用md5加盐算法
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
其中的
.padStart(32, '0')
,能够解决算出的md5值,缺失前面的0
的问题