Apache Camel PGP Embedded or Original filename - cryptography

I have a file lets say test.txt, I encrypt it into mypgpfile.pgp. Now when I decrypt this using apache camel, it writes the output to mypgpfile.pgp. Is there a way in Camel to know the embeddedfilename? I want the output to be written to test.txt instead of mypfpfile.pgp.
The code sample is simple as follows.
from("direct:unencrypt")
.unmarshal().pgp(keyFileNameSec, keyUserid, keyPassword)
Is it possible to get the original file name by writing custom code using bouncycastle? Can someone please help with suggestions, since retaining the original file name is an important requirement for us. Thanks for your help in advance!

Related

JSZip reports missing bytes when reading back previously uploaded zip file

I am working on a webapp where the user provides an image file-text sequence. I am compressing the sequence into a single ZIP file uisng JSZip.
On the server I simply use PHP move_uploaded_file to the desired location after having checked the file upload error status.
A test ZIP file created in this way can be found here. I have downloaded the file, expanded it in Windows Explorer and verified that its contents (two images and some HTML markup in this instance) are all present and correct.
So far so good. The trouble begins when I try to fetch that same ZIP file and expand it using JSZip.loadAsync which consistently reports Corrupted zip: missing 210 bytes. My PHP code for squirting back the ZIP file is actually pretty simple. Shorn of the various security checks I have in place the essential bits of that code are listed below
if (file_exists($file))
{
ob_clean();
readfile($file);
http_response_code(200);
die();
} else http_response_code(399);
where the 399 code is interpreted in my webapp as a need to create a new resource locally instead of trying to read existing resource data. The trouble happens when I use the result text (on an HTTP response of 200) and feed it to JSZip.loadAsync.
What am I doing wrong here? I assume there is something too naive about the way I am using readfile at the PHP end but I am unable to figure out what that might be.
What we set out to do
Attempt to grab a server-side ZIP file from JavaScript
If it does not exist send back a reply (I simply set a custom HTTP response code of 399 and interpret it) telling the client to go prepare its own new local copy of that resource
If it does exist send back that ZIP file
Good so far. However, reading the existent ZIP file into PHP and sending it back does not make sense + is fraught with problems. My approach now is to send back an http_response_code of 302 which the client interprets as being an instruction to "go get that ZIP for yourself directly".
At this point to get the ZIP "directly" simply follow the instructions in this tutorial on MDN.

How to encrypt server.ssl.key-store-password value and use it in SpringBoot

I would like to know is there anyway we can encrypt the server.ssl.key-store-password value and store it in application.properties file instead of storing it in plain text.
i couldn't find any documentation on this. Any help on this is highly appreciated.
Thanks in advance.
Spring allows you to encrypt the properties file but the key for that encryption needs to be kept somewhere. This answer suggest keeping them in environment variables and points to a guide about how to encrypt them if you still want to.
You can use "jasypt-spring-boot-starter" for your need. All you to need to do are the following steps.
Download the "jasypt-spring-boot-starter" from maven central repo.
com.github.ulisesbocchio
jasypt-spring-boot-starter
x.x.x
In your Spring Boot start file where the "#SpringBootApplication" annotation is located, just include "#EnableEncryptableProperties". A point to note here is that once you place encryptable properties annotation on the main start file, all the property files of your application will be loaded and scanned by Jaspyt module for any property value that is marked starting with "ENC".
In your "application.properties" file there are few more configurations that needed to be added like below (all these are defaults and you can change these according to your requirement):
jasypt.encryptor.password=<Some password for encryption>
jasypt.encryptor.algorithm=PBEWITHHMACSHA256ANDAES_128
jasypt.encryptor.key-obtention-iterations=1000
jasypt.encryptor.pool-size=1
jasypt.encryptor.salt-generator-classname=org.jasypt.salt.RandomSaltGenerator
jasypt.encryptor.iv-generator-classname=org.jasypt.iv.RandomIvGenerator
jasypt.encryptor.string-output-type=base64
Once you are done with the above steps, now you can place your encrypted property value under the ENC(). Jasypt will scan values which are enclosed in ENC() and will try to decrypt the value.
For e.g.
spring.datasource.password=ENC(tHe0atcRsE+uOTxt2GmFYPXNHREch9R/12qD082gw7vv6bby5Rk)

AmazonS3Client and credentials

I am trying to deal with being able to read a file hosted in S3 using a Java application. I have added the AmazonS3Client but it fails with when it goes to ProfileCredentialsProvider. I have my AWS credentials at C:/User/.aws (default), credentials are found but the following error is thrown: "Invalid property format: no '=' character". My credentiasl (download from Amazon) is a csv file separated by commas. Please can anybody tell me if I have to modify this file? Thanks in advance
Yes, you will need to change the format of that file; the ProfileCredentialsProvider class does not expect the CSV format, but instead expects the file to be formatted like one shown in the ProfilesConfigFile docs:
[default]
aws_access_key_id=testAccessKey
aws_secret_access_key=testSecretKey
Hope this helps!
If anybody ever stumbles upon this issue and cannot find any solutions, check if you have inline comments like [some-profile] #inline comment in your credentials file. Seems like it is not supported and breaks everything.

uploading files from iOS to web service

I have an app on the roll that requires me to upload files from it to a webservice. I am basically a noob in file transfer and in app-webservice comunications and would appreciate a direction in which to go.
The first question is how to encode the file? The webservice has to interpret the data sent so in which way do i do it? I don't own the webservice so i don't know how they pick up files, but i assume in a XML/JSON format.
The second question is how am i to send it? Having a XML object, how do i send it to, let's say, "http://www.website.com/path/to/upload". Is Async available?
If i'm missing or am wrong about a step (or 10) please correct me! Your help is much appreciated!
1: If it is a XML you will need to parse it, and create objet from it. If it's a Json, i recommend you https://github.com/johnezang/JSONKit JSONKIt, which is really awesome.
2: You 'll need get that data from webService and ASIHTTP is a really great tool to get fast web service call. The doc is really clear and comprehensible http://allseeing-i.com/ASIHTTPRequest/ is a must have.
3: You send your data either by url (get) or post.
Hope for you it's not into XML format, this is really painful, believe me

How is file upload handled in HTTP?

I am curious to know how webservers handle file uploads.
Is the entire file sent as a single chunk? Or is it streamed into the webserver - which puts it together and saves it in a temp folder for PHP etc. to use?
It's just a matter of following the encoding rules so that one can easily decode (parse) it. Read on the specification about multipart-form/data encoding (the one which is required in HTML based file uploads using input type="file").
Generally the parsing is done by the server side application itself. The webserver only takes care about streaming the bytes from the one to the other side.
It's streamed to answer that question, but see this RFC 1867 for more information.
RFC 1867 describes the mechanism.