¿Generar hash MD5 de una cadena usando la biblioteca estándar en Kotlin?
He intentado a continuación mencionar el código
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') }
¿Es esta la mejor manera o cuál?
Usar java.security.MessageDigest
es la forma más sencilla
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) }
En general, las funciones hash (resumen) toman una matriz de bytes como entrada y producen una matriz de bytes como salida. Por lo tanto, para codificar una cadena, primero debe convertirla en una matriz de bytes. Una forma común de hacer esto es codificar la cadena como una matriz de bytes UTF-8
: string.toByteArray(UTF_8)
Una forma común de mostrar una matriz de bytes como una cadena es convertir los bytes individuales a sus valores hexadecimales y concatenarlos. Aquí hay una función de extensión que hace eso:
fun ByteArray.toHex() = joinToString(separator = "") { byte -> "%02x".format(byte) }
MD5 produce una matriz de bytes de longitud 16. Cuando se convierte a hexadecimal, se representa mediante una cadena de longitud 32.
El código completo se ve así:
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 }
Tenga en cuenta que MD5 tiene debilidades bien conocidas que lo hacen inapropiado para muchos casos de uso. Las alternativas incluyen la familia SHA de funciones hash. Así es como se aplica SHA-256
en una cadena:
fun sha256(str: String): ByteArray = MessageDigest.getInstance("SHA-256").digest(str.toByteArray(UTF_8))
Sugeriría utilizar la versión 1.15 del códec Apache commons
<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!")) }