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 Responses
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
1
Popular in Questions
Hello everyone,
I try to use an Javascript Event Handler in my root.html.leex file.
Therefore I created a function in the app.js file: ...
New
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
Hi,
is there any work on GUI with Elixir, that is similar to Electron/Javascript? My idea is to bundle Phoenix and BEAM into a single se...
New
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
I’ve read in another post that it may be possible with a router helper - but I couldn’t find an appropriate one, and tbh, I’m still just ...
New
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum.
...
New
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this
"1000"
What is the ...
New
I’ve got an issue with an app and I’ve no idea of how to troubleshoot it. I’m hoping someone here might have seen something similar.
I p...
New
Hi!
Currently I want to submit a form by pressing the Enter key. However, since my input field is of type “textarea” this is just adds a...
New
Other popular topics
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1]
15:22:35.803 [error] gen_event {lager_file_backend...
New
Hello, how can I check the Phoenix version ?
Thanks !
New
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
In templates/appointment/index.html.eex:
<%= for appointment <- @appointments do %>
<tr>
<td><%= appoi...
New
I’m brand new to Phoenix and I have stripped one of the demo applications to the bone. I just want to get an svg up on the screen. Here i...
New
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors:
[WARN] - (starship::utils): Executing command ...
New
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
New
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
I would like to know what is the best IDE for elixir development?
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #javascript
- #code-sync
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance








