如何在 Kotlin 中生成 MD5 哈希?

How to Generate an MD5 hash in Kotlin?

使用 Kotlin 中的标准库生成字符串的 MD5 哈希?

我试过下面提到的代码

import java.math.BigInteger
import java.security.MessageDigest

fun md5(input:String): String {
    val md = MessageDigest.getInstance("MD5")
    return BigInteger(1, md.digest(input.toByteArray())).toString(16).padStart(32, '0')
}

这是最好的方法还是哪个?

使用java.security.MessageDigest是最简单的方法

import java.math.BigInteger
import java.security.MessageDigest

fun md5(input:String): String {
    val md = MessageDigest.getInstance("MD5")
    return BigInteger(1, md.digest(input.toByteArray())).toString(16).padStart(32, '0')
}
import java.math.BigInteger
import java.security.MessageDigest

fun main(args: Array<String>) {
    println(md5Hash("Hello, world!"))
}

fun md5Hash(str: String): String {
    val md = MessageDigest.getInstance("MD5")
    val bigInt = BigInteger(1, md.digest(str.toByteArray(Charsets.UTF_8)))
    return String.format("%032x", bigInt)
}

通常,散列(摘要)函数将字节数组作为输入并生成字节数组作为输出。因此,要散列 字符串,首先需要将其转换为字节数组。一种常见的做法是将字符串编码为 UTF-8 字节的数组:string.toByteArray(UTF_8)

将字节数组显示的一种常见方法是将各个字节转换为它们的十六进制值并将它们连接起来。这里有一个 extension function 可以做到这一点:

fun ByteArray.toHex() = joinToString(separator = "") { byte -> "%02x".format(byte) }

MD5产生一个长度为16的字节数组,转换为十六进制后,表示为长度为32的字符串。

整个代码如下所示:

import java.security.MessageDigest
import kotlin.text.Charsets.UTF_8

fun md5(str: String): ByteArray = MessageDigest.getInstance("MD5").digest(str.toByteArray(UTF_8))
fun ByteArray.toHex() = joinToString(separator = "") { byte -> "%02x".format(byte) }

fun main() {
    println(md5("Hello, world!").toHex()) //6cd3556deb0da54bca060b4c39479839
    println(md5("").toHex())              //d41d8cd98f00b204e9800998ecf8427e
}

注意 MD5 具有 well known weaknesses that make it inappropriate for many use cases. Alternatives include the SHA 系列哈希函数。以下是如何在字符串上应用 SHA-256

fun sha256(str: String): ByteArray = MessageDigest.getInstance("SHA-256").digest(str.toByteArray(UTF_8))

我建议使用 Apache commons 编解码器的 1.15 版

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.15</version>
</dependency>
import org.apache.commons.codec.digest.DigestUtils

fun main(args: Array<String>) {
    println(DigestUtils.md5Hex("Hello world!"))
}