favetelinguis

favetelinguis

Need help converting Java encryption example to Elixir

Im writing an integration in Elixir and as one part I need to create an encrypted login string. However I have zero experience with encryption and im not able to understand the Erlang docs well enogh to understand. I would rather use pure Erlang to do this that add some dependency to a Elexir wrapper if possible.

The Java code I need to write in Elixir looks as follows.

  private String encryptAuthParameter(String user, String password)
      throws NoSuchAlgorithmException, InvalidKeySpecException, IOException, NoSuchPaddingException,
          InvalidKeyException, IllegalBlockSizeException, BadPaddingException {

    // Construct the base for the auth parameter
    String login =
        Base64.getEncoder().encodeToString(user.getBytes())
            + ":"
            + Base64.getEncoder().encodeToString(password.getBytes())
            + ":"
            + Base64.getEncoder()
                .encodeToString(String.valueOf(System.currentTimeMillis()).getBytes());

    // RSA encrypt it using NNAPI public key
    PublicKey pubKey = getKeyFromPEM(Main.PUBLIC_KEY_FILENAME);
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, pubKey);

    byte[] encryptedBytes = cipher.doFinal(login.getBytes("UTF-8"));

    // Encode the encrypted data in Base64
    String encodedEncryptedBytes = Base64.getEncoder().encodeToString(encryptedBytes);

    return URLEncoder.encode(encodedEncryptedBytes, "UTF-8");
  }

  private static PublicKey getKeyFromPEM(String filename)
      throws NoSuchAlgorithmException, InvalidKeySpecException, IOException {
    BufferedReader reader = null;
    try {
      reader = new BufferedReader(new FileReader(filename));
      String line = null;
      String key = "";
      while (true) {
        line = reader.readLine();
        if (line == null) break;
        else if (line.startsWith("-----BEGIN PUBLIC KEY-----")) continue;
        else if (line.startsWith("-----END PUBLIC KEY-----")) continue;
        else key += line.trim();
      }
      byte[] binary = Base64.getDecoder().decode(key);
      X509EncodedKeySpec spec = new X509EncodedKeySpec(binary);
      KeyFactory kf = KeyFactory.getInstance("RSA");
      return kf.generatePublic(spec);
    } finally {
      if (reader != null) {
        reader.close();
      }
    }
  }

The only thing I have so far is:

  def encryptAuthParameter(user, password) do
    now = DateTime.utc_now() |> DateTime.to_unix(:millisecond) |> Integer.to_string()
    # Convert to Base64
    login = Base.encode64(user) <> ":" <> Base.encode64(password) <> ":" <> Base.encode64(now)
    # Use public key to encode message
    File.read!()
    # Base 64 encode the encrypted string
    login
  end

Most Liked

favetelinguis

favetelinguis

Turns out it was not that hard. Here is the code that got it working.

  def encryptAuthParameter(user, password) do
    # Convert to Base64
    now_str = DateTime.utc_now() |> DateTime.to_unix(:millisecond) |> Integer.to_string()
    login_msg = Base.encode64(user) <> ":" <> Base.encode64(password) <> ":" <> Base.encode64(now_str)
    # Use public key to encode message
    raw_p_key = getKeyFromPEM(@key)
    [enc_p_key] = :public_key.pem_decode(raw_p_key)
    p_key = :public_key.pem_entry_decode(enc_p_key)
    enc_msg = :public_key.encrypt_public(login_msg, p_key)
    # Base 64 encode the encrypted string
    Base.encode64(enc_msg)
  end

  def getKeyFromPEM(filename) do
    File.read!(filename)
  end

Where Next?

Popular in Questions Top

Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID&lt;0.412.0&gt; terminating ** (Postgrex.Error) FATAL...
New
fireproofsocks
I’m working on defining a simple Ecto schema for a table (in PostGres), but I don’t see where I can define a column as NOT NULL. Conside...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set? Thanks.
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
LegitStack
I’m hoping you guys can give me some general advice and perhaps code examples if you’re feeling up to it. I’m very interested in Elixir,...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New
polypush135
As many of you may have realized by now (sorry for all the posts here) I’ve been working on a db problem where I’m trying to aggregate a ...
New
gazoon
I want to know absolute current module path. In python i could do that: os.path.abspath(__file__) Does elixir have anything similar?
New
hpopp
To simplify some tasks at work, I wrote and published this package yesterday. It’s a simple macro that enables Access behaviour on struct...
New

Other popular topics Top

lastday4you
I wanted to check elixir version in phoenix because i found that my elixir is 1.5 but when i use Enum.chunk_by it said the function is un...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
977 41022 311
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set? Thanks.
New
srinivasu
How to handle excepions in elixir? Suppose i have A, B, C ,D, E modules. and each module has get() function. A.get() method will call th...
New
William
I would like to know that is there any online source for learning Phoenix Framework for building E-Commerce Store? Any advantage on build...
New
itssasanka
Hi all, Trying to get some more clarity over utc_datetime and naive_datetime for Ecto: https://hexdocs.pm/ecto/Ecto.Schema.html#module-...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New
chrismccord
As promised, the first release candidate of Phoenix 1.3.0 is out! This release focuses on code generators with improved project structure...
New

We're in Beta

About us Mission Statement