Я пытаюсь зашифровать и расшифровать пароль из файла на IntelliJ во время работы над проектом Scala Sbt. Это мой scala класс:
import java.security.MessageDigest
import java.util
import javax.crypto.Cipher
import javax.crypto.spec.SecretKeySpec
import org.apache.commons.codec.binary.Base64
class DataEncrypt {
def encrypt(key: String, value: String): String = {
val cipher: Cipher = Cipher.getInstance("AES/ECB/PKCS5Padding")
cipher.init(Cipher.ENCRYPT_MODE, keyToSpec(key))
Base64.encodeBase64String(cipher.doFinal(value.getBytes("UTF-8")))
}
def decrypt(key: String, encryptedValue: String): String = {
val cipher: Cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING")
cipher.init(Cipher.DECRYPT_MODE, keyToSpec(key))
new String(cipher.doFinal(Base64.decodeBase64(encryptedValue)))
}
def keyToSpec(key: String): SecretKeySpec = {
var keyBytes: Array[Byte] = (SALT + key).getBytes("UTF-8")
val sha: MessageDigest = MessageDigest.getInstance("SHA-1")
keyBytes = sha.digest(keyBytes)
keyBytes = util.Arrays.copyOf(keyBytes, 16)
new SecretKeySpec(keyBytes, "AES")
}
private val SALT: String = "jMhKlOuJnM34G6NHkqo9V010GhLAqOpF0BePojHgh1HgNg8^72k"
}
Мой файл build.sbt:
name := "AnalyzeTables"
version := "0.1"
scalaVersion := "2.11.8"
// https://mvnrepository.com/artifact/org.postgresql/postgresql
libraryDependencies += "org.postgresql" % "postgresql" % "42.1.4"
// https://mvnrepository.com/artifact/commons-codec/commons-codec
libraryDependencies += "commons-codec" % "commons-codec" % "1.13"
// https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
libraryDependencies += "org.apache.commons" % "commons-lang3" % "3.8.1"
Я создаю JAR-файл из проекта и выполняю его на cli, выполнив команду :
scala -cp /home/user/jars/postgresql-42.1.4.jar analyzetables_2.11-0.1.jar tablename
где analysistables_2.11-0.1.jar - это мой файл jar, а tablename - мой аргумент, который я читаю в коде. Если я отправляю код, я вижу исключение класса не найдено:
java.lang.ClassNotFoundException: org.apache.commons.codec.binary.Base64
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at com.enc.DataEncrypt.decrypt(DataEncrypt.scala:21)
at com.db.manager.GpConnection.<init>(GpConnection.scala:13)
at com.gp.analyze.GetStats.run_analyze(GetStats.scala:21)
Что именно происходит в: new String(cipher.doFinal(Base64.decodeBase64(encryptedValue)))
Я пытался найти решения в Интернете для проблемы, с которой столкнулся, и большинство ответов добавляло банку файл: commons-codec
к проекту, который у меня уже есть в файле build.sbt. У меня есть оператор импорта, а также попытался проверить, работает ли это:
new String(cipher.doFinal(org.apache.commons.codec.binary.Base64.decodeBase64(encryptedValue)))
Но все они дают classNotFoundException
. Я также попытался создать толстую банку, выполнив:
project Structure->Artifacts-> + ->jars->from modules with dependencies and run the fat jar.
В этом случае я вижу NullPointerException.
Структура моего проекта:
Может ли кто-нибудь сообщить мне, если мне нужно изменить настройки или добавить отсутствующий файл jar?