1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.wss4j.common.crypto;
21
22 import java.io.IOException;
23
24 import javax.security.auth.callback.Callback;
25 import javax.security.auth.callback.CallbackHandler;
26 import javax.security.auth.callback.UnsupportedCallbackException;
27
28 import org.apache.wss4j.common.ext.WSPasswordCallback;
29 import org.apache.wss4j.common.util.FIPSUtils;
30 import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
31 import org.jasypt.iv.RandomIvGenerator;
32 import org.jasypt.salt.RandomSaltGenerator;
33
34
35
36
37
38
39 public class JasyptPasswordEncryptor implements PasswordEncryptor {
40
41 public static final String DEFAULT_ALGORITHM =
42 FIPSUtils.isFIPSEnabled()
43 ? "PBEWithHmacSHA512AndAES_256" : "PBEWithMD5AndTripleDES";
44
45 private static final org.slf4j.Logger LOG =
46 org.slf4j.LoggerFactory.getLogger(JasyptPasswordEncryptor.class);
47
48 private final StandardPBEStringEncryptor passwordEncryptor;
49 private CallbackHandler callbackHandler;
50
51 public JasyptPasswordEncryptor(String password) {
52 this(password, DEFAULT_ALGORITHM);
53 }
54
55 public JasyptPasswordEncryptor(String password, String algorithm) {
56 passwordEncryptor = new StandardPBEStringEncryptor();
57 passwordEncryptor.setPassword(password);
58 passwordEncryptor.setAlgorithm(algorithm);
59 if (FIPSUtils.isFIPSEnabled()) {
60 passwordEncryptor.setSaltGenerator(new RandomSaltGenerator("PKCS11"));
61 passwordEncryptor.setIvGenerator(new RandomIvGenerator("PKCS11"));
62 }
63 }
64
65 public JasyptPasswordEncryptor(CallbackHandler callbackHandler) {
66 this(callbackHandler, DEFAULT_ALGORITHM);
67 }
68
69 public JasyptPasswordEncryptor(CallbackHandler callbackHandler, String algorithm) {
70 passwordEncryptor = new StandardPBEStringEncryptor();
71 passwordEncryptor.setAlgorithm(algorithm);
72 if (FIPSUtils.isFIPSEnabled()) {
73 passwordEncryptor.setSaltGenerator(new RandomSaltGenerator("PKCS11"));
74 passwordEncryptor.setIvGenerator(new RandomIvGenerator("PKCS11"));
75 }
76 this.callbackHandler = callbackHandler;
77 }
78
79
80
81
82
83
84 public String encrypt(String password) {
85 if (callbackHandler != null) {
86 WSPasswordCallback pwCb =
87 new WSPasswordCallback("", WSPasswordCallback.PASSWORD_ENCRYPTOR_PASSWORD);
88 try {
89 callbackHandler.handle(new Callback[]{pwCb});
90 } catch (IOException | UnsupportedCallbackException e) {
91 LOG.debug("Error in getting password: ", e);
92 }
93 if (pwCb.getPassword() != null) {
94 passwordEncryptor.setPassword(pwCb.getPassword());
95 }
96 }
97 return passwordEncryptor.encrypt(password);
98 }
99
100
101
102
103
104
105 public String decrypt(String encryptedPassword) {
106 if (callbackHandler != null) {
107 WSPasswordCallback pwCb =
108 new WSPasswordCallback("", WSPasswordCallback.PASSWORD_ENCRYPTOR_PASSWORD);
109 try {
110 callbackHandler.handle(new Callback[]{pwCb});
111 } catch (IOException | UnsupportedCallbackException e) {
112 LOG.debug("Error in getting password: ", e);
113 }
114 if (pwCb.getPassword() != null) {
115 passwordEncryptor.setPassword(pwCb.getPassword());
116 }
117 }
118 return passwordEncryptor.decrypt(encryptedPassword);
119 }
120
121 }