Goal
A servlet to return encrypt/decrypt words
Package Install
Encryption Request: http://localhost:4502/bin/experienceaem/encrypt?words=experience,aem
Decryption Request: http://localhost:4502/bin/experienceaem/decrypt?words={10d97d9138c4bc55f321b1120c44ff1b0aa33f1f39aac42b9d487d06e581dd83},{cd1449b90a6277816a638f45665f604f1d32a56ceadfd1dde56f9254812d28e8}
Solution
Create and deploy EncryptDecryptServlet with following code
package apps.experienceaem;
import com.adobe.granite.crypto.CryptoSupport;
import org.apache.commons.lang3.StringUtils;
import org.apache.felix.scr.annotations.*;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.commons.json.io.JSONWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.ServletException;
import java.io.IOException;
@Component(label = "Experience AEM Encryption Decryption Servlet")
@Service
@Properties({
@Property(name = "sling.servlet.methods", value = { "GET" }, propertyPrivate = true),
@Property(name = "sling.servlet.paths", value = {
"/bin/experienceaem/encrypt",
"/bin/experienceaem/decrypt"
})
})
public class EncryptDecryptServlet extends SlingAllMethodsServlet {
private static final Logger LOG = LoggerFactory.getLogger(EncryptDecryptServlet.class);
@Reference
protected CryptoSupport cryptoSupport;
@Override
protected void doGet(final SlingHttpServletRequest request, final SlingHttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
String words = request.getParameter("words");
String uri = request.getRequestURI();
if(StringUtils.isEmpty(words)){
throw new ServletException("Need words");
}
String[] wordsArr = words.split(",");
try{
JSONWriter jw = new JSONWriter(response.getWriter());
jw.object();
for(String word : wordsArr){
jw.key(word).value(uri.endsWith("encrypt") ? cryptoSupport.protect(word)
: cryptoSupport.unprotect(word));
}
jw.endObject();
}catch(Exception e){
LOG.error("Error encrypting/decrypting", e);
}
}
}


This is not working properly for me. I receive:
ReplyDeleteCaused by: com.adobe.granite.crypto.CryptoException: Failed decrypting cipher text
at com.adobe.granite.crypto.internal.CryptoSupportImpl.decrypt(CryptoSupportImpl.java:96)
at com.adobe.granite.crypto.internal.CryptoSupportImpl.unprotect(CryptoSupportImpl.java:157)
... 110 common frames omitted
Caused by: com.rsa.jsafe.JSAFE_PaddingException: Invalid padding.
at com.rsa.jsafe.JSAFE_SymmetricCipher.decryptFinal(Unknown Source)
at com.adobe.granite.crypto.internal.jsafe.JSafeCryptoSupport.getPlainText(JSafeCryptoSupport.java:325)
at com.adobe.granite.crypto.internal.jsafe.JSafeCryptoSupport.getPlainText(JSafeCryptoSupport.java:307)
at com.adobe.granite.crypto.internal.CryptoSupportImpl.decrypt(CryptoSupportImpl.java:94)
... 111 common frames omitted