Несоответствие кодировки MD5 и Base64 в R и Java / JavaScript - PullRequest
1 голос
/ 15 марта 2019

Я пытаюсь закодировать в base64 строку, которая была вычислена из функции MD5 в R. Но результат, похоже, отличается от того, что я получаю Scala / Java / JavaScript:

Scala / Java / JavaScriptдля пустой строки дает в результате: 1B2M2Y8AsgTpgAmY7PhCfg ==

import java.security.MessageDigest
import org.apache.commons.codec.binary.Base64

object Test extends  App {

  val empty = ""
  val md5 = MessageDigest.getInstance("MD5").digest(empty.getBytes("UTF-8"))

  val base64 = new String(Base64.encodeBase64(md5))
  println(base64)

  //Result: 1B2M2Y8AsgTpgAmY7PhCfg==

}

Аналогично, в JavaScript см. https://www.npmjs.com/package/js-md5

md5.base64(''); // 1B2M2Y8AsgTpgAmY7PhCfg==

Но в R,Я получаю другой результат: ZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2U =

> library(digest)
> md5 <- digest("", algo="md5", serialize=F)
> md5 [1] "d41d8cd98f00b204e9800998ecf8427e"
> base64encode(md5) [1] "ZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2U="

Мне интересно, если MD5 не кодирует в шестнадцатеричном виде?

Ответы [ 3 ]

1 голос
/ 15 марта 2019

Чтобы дублировать вывод Scala / Java / JS в R, преобразуйте вашу строку в необработанный массив.Это требует достаточного количества искажения строки:

x <- openssl::md5("")
m <- matrix(strsplit(x, "")[[1]], ncol=2, byrow=TRUE)
s <- strtoi(paste0(m[, 1], m[, 2]), 16)
openssl::base64_encode(as.raw(s))
# [1] "1B2M2Y8AsgTpgAmY7PhCfg=="
1 голос
/ 15 марта 2019

Когда вы делаете дайджест, просто попросите необработанный вектор и base64 кодируйте его (добавьте raw=TRUE).

library(digest)
md5 <- digest("", algo="md5", serialize=FALSE, raw=TRUE)
openssl::base64_encode(md5)
# [1] "1B2M2Y8AsgTpgAmY7PhCfg=="
1 голос
/ 15 марта 2019

В ваших примерах кодировка base64 применяется к различным объектам:

  • в R вы кодируете шестнадцатеричный дайджест, то есть строку ("d41d8cd98f00b204e9800998ecf8427e")
  • в Scala вы получаете массив байтов от MD5

В вашем коде Scala

scala> val md5 = MessageDigest.getInstance("MD5").digest(empty.getBytes("UTF-8"))
md5: Array[Byte] = Array(-44, 29, -116, -39, -113, 0, -78, 4, -23, -128, 9, -104, -20, -8, 66, 126)

Шестнадцатеричный дайджест MD5 в Scala такой же, как и в R:

scala> md5.map(v => f"$v%02x").mkString
res0: String = d41d8cd98f00b204e9800998ecf8427e
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...