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
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
After calling mix ecto.create I get this error:
17:00:32.162 [error] GenServer #PID<0.412.0> terminating
** (Postgrex.Error) FATAL...
New
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
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set?
Thanks.
New
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
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
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
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
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
I want to know absolute current module path. In python i could do that: os.path.abspath(__file__) Does elixir have anything similar?
New
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
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
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors:
[WARN] - (starship::utils): Executing command ...
New
Hello!
tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability.
After spen...
New
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set?
Thanks.
New
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
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
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
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
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
As promised, the first release candidate of Phoenix 1.3.0 is out! This release focuses on code generators with improved project structure...
New







