在 Kotlin 中生成 MD5 哈希的最佳方法是什么?

Ani*_*bla 9 security hash md5 sha 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')
}
Run Code Online (Sandbox Code Playgroud)

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

Ani*_*bla 14

使用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')
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*oko 8

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

将字节数组显示为字符串的常用方法是将单个字节转换为其十六进制值并将它们连接起来。这是一个执行此操作的扩展函数

fun ByteArray.toHex() = joinToString(separator = "") { byte -> "%02x".format(byte) }
Run Code Online (Sandbox Code Playgroud)

MD5产生一个长度为 16 的字节数组,转换为 hex 时,用长度为 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
}
Run Code Online (Sandbox Code Playgroud)

请注意,MD5 有充分记录的弱点,使其不适用于许多用例。替代方案包括SHA系列的散列函数。以下是应用于SHA-256字符串的方法:

fun sha256(str: String): ByteArray = MessageDigest.getInstance("SHA-256").digest(str.toByteArray(UTF_8))
Run Code Online (Sandbox Code Playgroud)


Mar*_*son 6

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

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.15</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
import org.apache.commons.codec.digest.DigestUtils

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

  • 当 JDK 有内置类时,为什么要添加整个依赖项? (3认同)
  • 比 JDK 更经过测试?我不信。两年前错了,现在错了。 (2认同)