This is an automated email from the ASF dual-hosted git repository.

mehul pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/master by this push:
     new eb7aacf  RANGER-3055 : Make Ranger source code FIPS complaint
eb7aacf is described below

commit eb7aacfb1922c2d2c02a169f10da8a85b9a00240
Author: Dhaval Shah <[email protected]>
AuthorDate: Tue Dec 8 09:50:27 2020 +0530

    RANGER-3055 : Make Ranger source code FIPS complaint
    
    Signed-off-by: Mehul Parikh <[email protected]>
---
 .../hadoop/config/RangerAdminConfig.java           |  13 +-
 .../hadoop/config/RangerConfigConstants.java       |   1 +
 .../model/RangerPolicyResourceSignature.java       |  13 +-
 .../store/RangerServiceResourceSignature.java      |   7 +-
 .../ranger/credentialapi/CredentialReader.java     |  31 +++-
 .../org/apache/ranger/credentialapi/buildks.java   | 156 ++++++++++++-------
 .../ranger/credentialapi/TestCredentialReader.java |   2 +-
 .../apache/ranger/credentialapi/Testbuildks.java   |   4 +-
 .../tomcat/ElasticSearchIndexBootStrapper.java     |   4 +-
 .../ranger/server/tomcat/EmbeddedServer.java       |  20 ++-
 .../apache/hadoop/crypto/key/JKS2RangerUtil.java   |   6 +-
 .../crypto/key/KeySecureToRangerDBMKUtil.java      |   4 +-
 .../apache/hadoop/crypto/key/Ranger2JKSUtil.java   |   4 +-
 .../hadoop/crypto/key/RangerKeyStoreProvider.java  |   4 +-
 .../apache/hadoop/crypto/key/RangerMasterKey.java  |   4 +-
 ranger-util/src/scripts/saveVersion.py             |   4 +-
 .../main/java/org/apache/ranger/biz/UserMgr.java   | 171 +++++++++++++++------
 .../org/apache/ranger/common/PropertiesUtil.java   |  21 +--
 .../ranger/credentialapi/CredentialReader.java     |  45 ++++--
 .../ranger/patch/cliutil/ChangePasswordUtil.java   |  58 ++++---
 .../main/java/org/apache/ranger/rest/UserREST.java |   1 -
 .../handler/RangerAuthenticationProvider.java      |  40 +++--
 .../ranger/util/Pbkdf2PasswordEncoderCust.java     | 115 ++++++++++++++
 .../ranger/tagsync/process/TagSyncConfig.java      |  15 +-
 .../unixusersync/config/UserGroupSyncConfig.java   |  37 ++++-
 .../process/PolicyMgrUserGroupBuilder.java         |   5 +-
 .../authentication/UnixAuthenticationService.java  |  22 ++-
 27 files changed, 601 insertions(+), 206 deletions(-)

diff --git 
a/agents-common/src/main/java/org/apache/ranger/authorization/hadoop/config/RangerAdminConfig.java
 
b/agents-common/src/main/java/org/apache/ranger/authorization/hadoop/config/RangerAdminConfig.java
index 5cd539a..af47a20 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/authorization/hadoop/config/RangerAdminConfig.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/authorization/hadoop/config/RangerAdminConfig.java
@@ -19,12 +19,16 @@
 
 package org.apache.ranger.authorization.hadoop.config;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 
+import java.security.KeyStore;
+
 public class RangerAdminConfig extends RangerConfiguration {
     private static final Logger LOG = 
Logger.getLogger(RangerAdminConfig.class);
 
     private static volatile RangerAdminConfig sInstance = null;
+    private final boolean isFipsEnabled;
 
     public static RangerAdminConfig getInstance() {
         RangerAdminConfig ret = RangerAdminConfig.sInstance;
@@ -44,11 +48,12 @@ public class RangerAdminConfig extends RangerConfiguration {
 
     private RangerAdminConfig() {
         super();
-
         addAdminResources();
+        String storeType = get(RangerConfigConstants.RANGER_KEYSTORE_TYPE, 
KeyStore.getDefaultType());
+        isFipsEnabled = StringUtils.equalsIgnoreCase("bcfks", storeType) ? 
true : false;
+        
     }
 
-
     private boolean addAdminResources() {
         if (LOG.isDebugEnabled()) {
             LOG.debug("==> addAdminResources()");
@@ -82,4 +87,8 @@ public class RangerAdminConfig extends RangerConfiguration {
 
         return ret;
     }
+
+    public boolean isFipsEnabled() {
+        return isFipsEnabled;
+    }
 }
diff --git 
a/agents-common/src/main/java/org/apache/ranger/authorization/hadoop/config/RangerConfigConstants.java
 
b/agents-common/src/main/java/org/apache/ranger/authorization/hadoop/config/RangerConfigConstants.java
index 1ad34ef..374c78c 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/authorization/hadoop/config/RangerConfigConstants.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/authorization/hadoop/config/RangerConfigConstants.java
@@ -29,6 +29,7 @@ public class RangerConfigConstants {
        public static final String      RANGER_PLUGIN_POLICY_POLLINVETERVALMS   
                = "ranger.plugin.<ServiceType>.policy.pollIntervalMs";
     public static final String RANGER_PLUGIN_POLICY_CACHE_DIR                  
                = "ranger.plugin.<ServiceType>.policy.cache.dir";
     public static final        String  RANGER_PLUGIN_ADD_HADDOOP_AUTHORIZATION 
                = "xasecure.add-hadoop-authorization";
+    public static final String  RANGER_KEYSTORE_TYPE                           
 = "ranger.keystore.file.type";
 
     //CHANGE MAP CONSTANTS
     public static final String XASECURE_POLICYMGR_URL                          
                        = "xasecure.<ServiceType>.policymgr.url";
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerPolicyResourceSignature.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerPolicyResourceSignature.java
index 2bb6589..312005e 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerPolicyResourceSignature.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerPolicyResourceSignature.java
@@ -31,6 +31,7 @@ import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.ranger.authorization.hadoop.config.RangerAdminConfig;
 import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource;
 import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItemCondition;
 import org.apache.solr.common.StringUtils;
@@ -49,7 +50,11 @@ public class RangerPolicyResourceSignature {
                _policy = policy;
                PolicySerializer serializer = new PolicySerializer(_policy);
                _string = serializer.toString();
-               _hash = DigestUtils.sha256Hex(_string);
+               if (RangerAdminConfig.getInstance().isFipsEnabled()) {
+                       _hash = DigestUtils.sha512Hex(_string);
+               } else {
+                       _hash = DigestUtils.sha256Hex(_string);
+               }
        }
 
        /**
@@ -63,7 +68,11 @@ public class RangerPolicyResourceSignature {
                } else {
                        _string = string;
                }
-                _hash = DigestUtils.sha256Hex(_string);
+               if (RangerAdminConfig.getInstance().isFipsEnabled()) {
+                       _hash = DigestUtils.sha384Hex(_string);
+               } else {
+                       _hash = DigestUtils.sha256Hex(_string);
+               }
        }
        
        String asString() {
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/store/RangerServiceResourceSignature.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/store/RangerServiceResourceSignature.java
index d7fedf0..63546f8 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/store/RangerServiceResourceSignature.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/store/RangerServiceResourceSignature.java
@@ -20,6 +20,7 @@
 package org.apache.ranger.plugin.store;
 
 import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.ranger.authorization.hadoop.config.RangerAdminConfig;
 import org.apache.ranger.plugin.model.RangerPolicy;
 import org.apache.ranger.plugin.model.RangerServiceResource;
 
@@ -31,7 +32,11 @@ public class RangerServiceResourceSignature {
 
        public RangerServiceResourceSignature(RangerServiceResource 
serviceResource) {
                _string = ServiceResourceSerializer.toString(serviceResource);
-                _hash   = DigestUtils.sha256Hex(_string);
+               if (RangerAdminConfig.getInstance().isFipsEnabled()) {
+                       _hash = DigestUtils.sha512Hex(_string);
+               } else {
+                       _hash = DigestUtils.sha256Hex(_string);
+               }
        }
 
        String asString() {
diff --git 
a/credentialbuilder/src/main/java/org/apache/ranger/credentialapi/CredentialReader.java
 
b/credentialbuilder/src/main/java/org/apache/ranger/credentialapi/CredentialReader.java
index 42497e3..5b72c9d 100644
--- 
a/credentialbuilder/src/main/java/org/apache/ranger/credentialapi/CredentialReader.java
+++ 
b/credentialbuilder/src/main/java/org/apache/ranger/credentialapi/CredentialReader.java
@@ -21,14 +21,15 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.security.alias.CredentialProvider;
 import org.apache.hadoop.security.alias.CredentialProviderFactory;
 import org.apache.hadoop.security.alias.JavaKeyStoreProvider;
 
 public class CredentialReader {
-       
-  public static String getDecryptedString(String 
CrendentialProviderPath,String alias) {
+
+  public static String getDecryptedString(String 
CrendentialProviderPath,String alias, String storeType) {
          String credential=null;
          try{
                  if(CrendentialProviderPath==null || alias==null){
@@ -39,17 +40,31 @@ public class CredentialReader {
                  String 
crendentialProviderPrefixJceks=JavaKeyStoreProvider.SCHEME_NAME + "://file";
                  String 
crendentialProviderPrefixLocalJceks="localjceks://file";
                  
crendentialProviderPrefixJceks=crendentialProviderPrefixJceks.toLowerCase();
+
+                 String crendentialProviderPrefixBcfks = "bcfks" + "://file";
+                 String crendentialProviderPrefixLocalBcfks= "localbcfks" + 
"://file";
+                 
crendentialProviderPrefixBcfks=crendentialProviderPrefixBcfks.toLowerCase();
+                 
crendentialProviderPrefixLocalBcfks=crendentialProviderPrefixLocalBcfks.toLowerCase();
+
                  CrendentialProviderPath=CrendentialProviderPath.trim();
                  alias=alias.trim();
-                 
if(CrendentialProviderPath.toLowerCase().startsWith(crendentialProviderPrefixJceks)
 || 
CrendentialProviderPath.toLowerCase().startsWith(crendentialProviderPrefixLocalJceks)){
+                 
if(CrendentialProviderPath.toLowerCase().startsWith(crendentialProviderPrefixJceks)
 ||
+                                 
CrendentialProviderPath.toLowerCase().startsWith(crendentialProviderPrefixLocalJceks)
 ||
+                                 
CrendentialProviderPath.toLowerCase().startsWith(crendentialProviderPrefixBcfks)
 ||
+                                 
CrendentialProviderPath.toLowerCase().startsWith(crendentialProviderPrefixLocalBcfks)){
                          
conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH,
                                           //UserProvider.SCHEME_NAME + ":///," 
+
                          CrendentialProviderPath);
                  }else{
                          if(CrendentialProviderPath.startsWith("/")){
-                                 
conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH,
-                                                  //UserProvider.SCHEME_NAME + 
":///," +
-                                 JavaKeyStoreProvider.SCHEME_NAME + "://file" 
+ CrendentialProviderPath);
+                                if(StringUtils.equalsIgnoreCase(storeType, 
"bcfks")) {
+                                        
conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH, 
CrendentialProviderPath);
+                                } else {
+                                        
conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH,
+                                                        
//UserProvider.SCHEME_NAME + ":///," +
+                                                        
JavaKeyStoreProvider.SCHEME_NAME + "://file" + CrendentialProviderPath);
+                                }
+
                          }else{
                                  
conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH,
                                                   //UserProvider.SCHEME_NAME + 
":///," +
@@ -64,7 +79,7 @@ public class CredentialReader {
                          aliasesList=provider.getAliases();
                          if(aliasesList!=null && 
aliasesList.contains(alias.toLowerCase())){
                                  credEntry=null;
-                                 credEntry= provider.getCredentialEntry(alias);
+                                 credEntry= 
provider.getCredentialEntry(alias.toLowerCase());
                                  pass = credEntry.getCredential();
                                  if(pass!=null && pass.length>0){
                                          credential=String.valueOf(pass);
@@ -78,4 +93,4 @@ public class CredentialReader {
          }
          return credential;
   }
-}
\ No newline at end of file
+}
diff --git 
a/credentialbuilder/src/main/java/org/apache/ranger/credentialapi/buildks.java 
b/credentialbuilder/src/main/java/org/apache/ranger/credentialapi/buildks.java
index cb391cc..5d196d9 100644
--- 
a/credentialbuilder/src/main/java/org/apache/ranger/credentialapi/buildks.java
+++ 
b/credentialbuilder/src/main/java/org/apache/ranger/credentialapi/buildks.java
@@ -23,7 +23,8 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.lang.reflect.Field;
-
+import java.security.KeyStore;
+import java.util.Arrays;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.security.alias.CredentialShell;
 import org.apache.hadoop.util.GenericOptionsParser;
@@ -64,8 +65,10 @@ public class buildks {
        String providerOption=null;
        String providerPath=null;
        String tempCredential=null;
+       String storeTypeOption="storeType";
+               String storeType= KeyStore.getDefaultType();
                try{                            
-               if(args!=null && args.length==6)
+               if(args!=null && (args.length == 6 || args.length==8))
                {
                        command=args[0];
                        alias=args[1];
@@ -73,11 +76,15 @@ public class buildks {
                        credential=args[3];
                        providerOption=args[4];
                        providerPath=args[5];
-                               
if(!isValidCreateCommand(command,alias,valueOption,credential,providerOption,providerPath)){
+                       if (args.length == 8) {
+                                       storeTypeOption = args[6];
+                                       storeType = args[7];
+                               }
+                               
if(!isValidCreateCommand(command,alias,valueOption,credential,providerOption,providerPath,storeTypeOption,storeType)){
                                return returnCode;
                                }
                                deleteInvalidKeystore(providerPath);
-                       
tempCredential=CredentialReader.getDecryptedString(providerPath, alias);
+                       
tempCredential=CredentialReader.getDecryptedString(providerPath, alias, 
storeType);
                }else{
                        return returnCode;
                }
@@ -115,8 +122,10 @@ public class buildks {
                String valueOption=null;
                String credential=null;
                String providerOption=null;
-               String providerPath=null;               
-               if(args!=null && args.length==6)
+               String providerPath=null;
+               String storeTypeOption="storeType";
+               String storeType=KeyStore.getDefaultType();
+               if(args!=null && (args.length == 6 || args.length==8))
                {
                        command=args[0];
                        alias=args[1];
@@ -124,7 +133,11 @@ public class buildks {
                        credential=args[3];
                        providerOption=args[4];
                        providerPath=args[5];
-                               
if(!isValidCreateCommand(command,alias,valueOption,credential,providerOption,providerPath)){
+                       if (args.length == 8) {
+                                       storeTypeOption = args[6];
+                                       storeType = args[7];
+                               }
+                               
if(!isValidCreateCommand(command,alias,valueOption,credential,providerOption,providerPath,storeTypeOption,storeType)){
                                return returnCode;
                        }                       
                        displayCommand(args);
@@ -139,16 +152,16 @@ public class buildks {
                //set the configuration back, so that Tool can configure itself
                cs.setConf(conf);
                //get valid and remaining argument
-               String[] toolArgs = parser.getRemainingArgs();          
+               String[] toolArgs = parser.getRemainingArgs();
                //execute command in CredentialShell
                        // int i = 0;
                        //  for(String s : toolArgs) {
                        //              System.out.println("TooArgs [" + i + "] 
= [" + s + "]");
                    //          i++;
                        // }
-               returnCode= cs.run(toolArgs);
+                       String[] finalArgs = Arrays.copyOfRange(toolArgs, 0, 6);
+                       returnCode= cs.run(finalArgs);
                //if response code is zero then success else failure            
-               //System.out.println("Response Code:"+returnCode);              
                }catch(IOException ex){
                ex.printStackTrace();
        } catch(Exception ex){
@@ -165,7 +178,9 @@ public class buildks {
                String valueOption=null;
                String credential=null;
                String providerOption=null;
-               String providerPath=null;               
+               String providerPath=null;
+               String storeTypeOption=null;
+               String storeType=null;
                //below code can ask user to input if command line input fails  
                
                System.out.println("Enter Alias Name:");
                BufferedReader bufferRead = new BufferedReader(new 
InputStreamReader(System.in));                       
@@ -174,7 +189,9 @@ public class buildks {
                credential = bufferRead.readLine();
                System.out.println("Enter .jceks output file name with path:");
                providerPath = bufferRead.readLine();
-                       if(providerPath!=null && !providerPath.trim().isEmpty() 
&& 
!providerPath.startsWith("localjceks://file")&&!providerPath.startsWith("jceks://file"))
+                       if(providerPath!=null && !providerPath.trim().isEmpty() 
&&
+                                       
(!providerPath.startsWith("localjceks://file")&&!providerPath.startsWith("jceks://file")
 &&
+                                       
!providerPath.startsWith("localbcfks://file")&&!providerPath.startsWith("bcfks://file")))
                        {
                        if(providerPath.startsWith("/")){
                                        
providerPath="jceks://file"+providerPath;
@@ -185,7 +202,7 @@ public class buildks {
                command="create";
                valueOption="-value";
                providerOption="-provider";
-                       
if(!isValidCreateCommand(command,alias,valueOption,credential,providerOption,providerPath)){
+                       
if(!isValidCreateCommand(command,alias,valueOption,credential,providerOption,providerPath,storeTypeOption,storeType)){
                        return returnCode;
                }
                args=new String[6];
@@ -220,13 +237,14 @@ public class buildks {
                String command=null;
                String providerOption=null;
                String providerPath=null;
+               String storeType = KeyStore.getDefaultType();
                try{                            
                if(args!=null && args.length==3)
                {
                                command=args[0];
                                providerOption=args[1];
                                providerPath=args[2];
-                               
if(!isValidListCommand(command,providerOption,providerPath)){
+                               
if(!isValidListCommand(command,providerOption,providerPath, storeType)){
                                        return returnCode;
                                }
                        //display command which need to be executed or entered
@@ -285,7 +303,8 @@ public class buildks {
                //get valid and remaining argument
                String[] toolArgs = parser.getRemainingArgs();                  
                //execute command in CredentialShell
-               returnCode= cs.run(toolArgs);
+//             String[] finalArgs = Arrays.copyOfRange(toolArgs, 0, 6);
+                       returnCode= cs.run(toolArgs);
                //if response code is zero then success else failure            
                //System.out.println("Response Code:"+returnCode);              
                }catch(IOException ex){
@@ -296,7 +315,9 @@ public class buildks {
                return returnCode;
        }       
        
-       public static boolean isValidCreateCommand(String command,String 
alias,String valueOption,String credential,String providerOption,String 
providerPath)
+       public static boolean isValidCreateCommand(String command,String 
alias,String valueOption,String credential,
+                                                                               
           String providerOption,String providerPath, String storeTypeOption,
+                                                                               
           String storeType)
     {
                boolean isValid=true;
                try{
@@ -304,68 +325,70 @@ public class buildks {
                {
                        System.out.println("Invalid create phrase in credential 
creation command!!");
                        System.out.println("Expected:'create' 
Found:'"+command+"'");
-                               displaySyntax("create");
+                               displaySyntax("create", storeType);
                        return false;
                }
                if(alias==null || "".equalsIgnoreCase(alias.trim()))
                {
                        System.out.println("Invalid alias name phrase in 
credential creation command!!");
                        System.out.println("Found:'"+alias+"'");
-                               displaySyntax("create");
+                               displaySyntax("create", storeType);
                        return false;
                }
                if(valueOption==null || 
!"-value".equalsIgnoreCase(valueOption.trim()))
                {
                        System.out.println("Invalid value option switch in 
credential creation command!!");
                        System.out.println("Expected:'-value' 
Found:'"+valueOption+"'");
-                               displaySyntax("create");
+                               displaySyntax("create", storeType);
                        return false;
                }
                if(valueOption==null || 
!"-value".equalsIgnoreCase(valueOption.trim()))
                {
                        System.out.println("Invalid value option in credential 
creation command!!");
                        System.out.println("Expected:'-value' 
Found:'"+valueOption+"'");
-                               displaySyntax("create");
+                               displaySyntax("create", storeType);
                        return false;
                }
                if(credential==null)
                {
                        System.out.println("Invalid credential value in 
credential creation command!!");
                        System.out.println("Found:"+credential);
-                               displaySyntax("create");
+                               displaySyntax("create", storeType);
                        return false;
                }
                if(providerOption==null || 
!"-provider".equalsIgnoreCase(providerOption.trim()))
                {
                        System.out.println("Invalid provider option in 
credential creation command!!");
                        System.out.println("Expected:'-provider' 
Found:'"+providerOption+"'");
-                               displaySyntax("create");
+                               displaySyntax("create", storeType);
                        return false;
                }
-                       if(providerPath==null || 
"".equalsIgnoreCase(providerPath.trim()) || 
(!providerPath.startsWith("localjceks://") && 
!providerPath.startsWith("jceks://")))
+                       if(providerPath==null || 
"".equalsIgnoreCase(providerPath.trim()) ||
+                                       
((!providerPath.startsWith("localjceks://") && 
!providerPath.startsWith("jceks://")) &&
+                                       
(!providerPath.startsWith("localbcfks://") && 
!providerPath.startsWith("bcfks://"))))
                {
                        System.out.println("Invalid provider option in 
credential creation command!!");
                        System.out.println("Found:'"+providerPath+"'");
-                               displaySyntax("create");
+                               displaySyntax("create", storeType);
                        return false;
                }
        }catch(Exception ex){           
                System.out.println("Invalid input or runtime error! Please try 
again.");
                System.out.println("Input:"+command+" "+alias+" "+valueOption+" 
"+credential+" "+providerOption+" "+providerPath);
-                       displaySyntax("create");
+                       displaySyntax("create", storeType);
                ex.printStackTrace();
                return false;
        }               
        return isValid;
     }
 
-       public static boolean isValidListCommand(String command,String 
providerOption,String providerPath){
+       public static boolean isValidListCommand(String command,String 
providerOption,String providerPath, String storeTpe){
                boolean isValid=true;
                try{
                        if(command==null || 
!"list".equalsIgnoreCase(command.trim())){
                                System.out.println("Invalid list phrase in 
credential get command!!");
                                System.out.println("Expected:'list' 
Found:'"+command+"'");
-                               displaySyntax("list");
+                               displaySyntax("list", storeTpe);
                                return false;
                        }
 
@@ -373,20 +396,22 @@ public class buildks {
                        {
                                System.out.println("Invalid provider option in 
credential get command!!");
                                System.out.println("Expected:'-provider' 
Found:'"+providerOption+"'");
-                               displaySyntax("list");
+                               displaySyntax("list", storeTpe);
                                return false;
                        }
-                       if(providerPath==null || 
"".equalsIgnoreCase(providerPath.trim()) || 
(!providerPath.startsWith("localjceks://") && 
!providerPath.startsWith("jceks://")))
+                       if(providerPath==null || 
"".equalsIgnoreCase(providerPath.trim()) ||
+                                       
((!providerPath.startsWith("localjceks://") && 
!providerPath.startsWith("jceks://")) &&
+                                       
(!providerPath.startsWith("localbcfks://") && 
!providerPath.startsWith("bcfks://"))))
                        {
                                System.out.println("Invalid provider option in 
credential get command!!");
                                System.out.println("Found:'"+providerPath+"'");
-                               displaySyntax("list");
+                               displaySyntax("list", storeTpe);
                                return false;
                        }
                }catch(Exception ex){
                        System.out.println("Invalid input or runtime error! 
Please try again.");
                        System.out.println("Input:"+command+" 
"+providerOption+" "+providerPath);
-                       displaySyntax("list");
+                       displaySyntax("list", storeTpe);
                        ex.printStackTrace();
                        return false;
                }
@@ -407,19 +432,35 @@ public class buildks {
                }
     }
        
-       public static void displaySyntax(String command){
-               if(command!=null && command.trim().equalsIgnoreCase("create")){
-                       System.out.println("Correct syntax is:create 
<aliasname> -value <password> -provider <jceks://file/filepath>");
-                       System.out.println("sample command is:create myalias 
-value password123 -provider jceks://file/tmp/ks/myks.jceks");
-               }
-               if(command!=null && command.trim().equalsIgnoreCase("list")){
-                       System.out.println("Correct syntax is:list -provider 
<jceks://file/filepath>");
-                       System.out.println("sample command is:list -provider 
jceks://file/tmp/ks/myks.jceks");
-               }
-               if(command!=null && command.trim().equalsIgnoreCase("get")){
-                       System.out.println("Correct syntax is:get <aliasname> 
-provider <jceks://file/filepath>");
-                       System.out.println("sample command is:get myalias 
-provider jceks://file/tmp/ks/myks.jceks");
+       public static void displaySyntax(String command, String storeType){
+               if ("bcfks".equalsIgnoreCase(storeType)) {
+                       if (command != null && 
command.trim().equalsIgnoreCase("create")) {
+                               System.out.println("Correct syntax is:create 
<aliasname> -value <password> -provider <bcfks://file/filepath>");
+                               System.out.println("sample command is:create 
myalias -value password123 -provider bcfks://file/tmp/ks/myks.bcfks");
+                       }
+                       if (command != null && 
command.trim().equalsIgnoreCase("list")) {
+                               System.out.println("Correct syntax is:list 
-provider <bcfks://file/filepath>");
+                               System.out.println("sample command is:list 
-provider bcfks://file/tmp/ks/myks.bcfks");
+                       }
+                       if (command != null && 
command.trim().equalsIgnoreCase("get")) {
+                               System.out.println("Correct syntax is:get 
<aliasname> -provider <bcfks://file/filepath>");
+                               System.out.println("sample command is:get 
myalias -provider bcfks://file/tmp/ks/myks.bcfks");
+                       }
+               } else {
+                       if (command != null && 
command.trim().equalsIgnoreCase("create")) {
+                               System.out.println("Correct syntax is:create 
<aliasname> -value <password> -provider <jceks://file/filepath>");
+                               System.out.println("sample command is:create 
myalias -value password123 -provider jceks://file/tmp/ks/myks.jceks");
+                       }
+                       if (command != null && 
command.trim().equalsIgnoreCase("list")) {
+                               System.out.println("Correct syntax is:list 
-provider <jceks://file/filepath>");
+                               System.out.println("sample command is:list 
-provider jceks://file/tmp/ks/myks.jceks");
+                       }
+                       if (command != null && 
command.trim().equalsIgnoreCase("get")) {
+                               System.out.println("Correct syntax is:get 
<aliasname> -provider <jceks://file/filepath>");
+                               System.out.println("sample command is:get 
myalias -provider jceks://file/tmp/ks/myks.jceks");
+                       }
                }
+
        }
        public String getCredential(String args[]){
                String command=null;
@@ -427,19 +468,20 @@ public class buildks {
                String providerOption=null;
                String providerPath=null;
                String tempCredential=null;
+               String storeType=KeyStore.getDefaultType();
                try{
                        if(args!=null && args.length==4){
                                command=args[0];
                                alias=args[1];
                                providerOption=args[2];
                                providerPath=args[3];
-                               
if(!isValidGetCommand(command,alias,providerOption,providerPath)){
-                                       displaySyntax("get");
+                               
if(!isValidGetCommand(command,alias,providerOption,providerPath,storeType)){
+                                       displaySyntax("get", storeType);
                                }else{
-                                       
tempCredential=CredentialReader.getDecryptedString(providerPath, alias);
+                                       
tempCredential=CredentialReader.getDecryptedString(providerPath, alias, 
storeType);
                                }
                        }else{
-                               displaySyntax("get");
+                               displaySyntax("get", storeType);
                        }
                        if(tempCredential==null){
                                System.out.println("Alias "+ alias +" does not 
exist!!");
@@ -450,40 +492,42 @@ public class buildks {
                        return tempCredential;
        }
 
-       public static boolean isValidGetCommand(String command,String 
alias,String providerOption,String providerPath){
+       public static boolean isValidGetCommand(String command,String 
alias,String providerOption,String providerPath,String storeType){
                boolean isValid=true;
                try{
                        if(command==null || 
!"get".equalsIgnoreCase(command.trim())){
                                System.out.println("Invalid get phrase in 
credential get command!!");
                                System.out.println("Expected:'get' 
Found:'"+command+"'");
-                               displaySyntax("get");
+                               displaySyntax("get", storeType);
                                return false;
                        }
                        if(alias==null || "".equalsIgnoreCase(alias.trim()))
                        {
                                System.out.println("Invalid alias name phrase 
in credential get command!!");
                                System.out.println("Found:'"+alias+"'");
-                               displaySyntax("get");
+                               displaySyntax("get", storeType);
                                return false;
                        }
                        if(providerOption==null || 
!"-provider".equalsIgnoreCase(providerOption.trim()))
                        {
                                System.out.println("Invalid provider option in 
credential get command!!");
                                System.out.println("Expected:'-provider' 
Found:'"+providerOption+"'");
-                               displaySyntax("get");
+                               displaySyntax("get", storeType);
                                return false;
                        }
-                       if(providerPath==null || 
"".equalsIgnoreCase(providerPath.trim()) || 
(!providerPath.startsWith("localjceks://") && 
!providerPath.startsWith("jceks://")))
+                       if(providerPath==null || 
"".equalsIgnoreCase(providerPath.trim()) ||
+                                       
(!providerPath.startsWith("localjceks://") && 
!providerPath.startsWith("jceks://")) &&
+                                       
(!providerPath.startsWith("localbcfks://") && 
!providerPath.startsWith("bcfks://")))
                        {
                                System.out.println("Invalid provider option in 
credential get command!!");
                                System.out.println("Found:'"+providerPath+"'");
-                               displaySyntax("get");
+                               displaySyntax("get", storeType);
                                return false;
                        }
                }catch(Exception ex){
                        System.out.println("Invalid input or runtime error! 
Please try again.");
                        System.out.println("Input:"+command+" "+alias+" 
"+providerOption+" "+providerPath);
-                       displaySyntax("get");
+                       displaySyntax("get", storeType);
                        ex.printStackTrace();
                        return false;
                }
@@ -522,6 +566,10 @@ public class buildks {
                                
keystore=providerPath.replace("jceks://file","");
                        }else if(providerPath.startsWith("localjceks://file")){
                                
keystore=providerPath.replace("jceks://file","");
+                       }else if(providerPath.startsWith("bcfks://file")){
+                               
keystore=providerPath.replace("bcfks://file","");
+                       }else if(providerPath.startsWith("localbcfks://file")){
+                               
keystore=providerPath.replace("bcfks://file","");
                        }else{
                                keystore=providerPath;
                        }
diff --git 
a/credentialbuilder/src/test/java/org/apache/ranger/credentialapi/TestCredentialReader.java
 
b/credentialbuilder/src/test/java/org/apache/ranger/credentialapi/TestCredentialReader.java
index 006986c..ff3ce84 100644
--- 
a/credentialbuilder/src/test/java/org/apache/ranger/credentialapi/TestCredentialReader.java
+++ 
b/credentialbuilder/src/test/java/org/apache/ranger/credentialapi/TestCredentialReader.java
@@ -50,7 +50,7 @@ public class TestCredentialReader {
 
     @Test
     public void testPassword() throws Exception {
-        String password = CredentialReader.getDecryptedString(keystoreFile, 
"TestCredential2");
+        String password = CredentialReader.getDecryptedString(keystoreFile, 
"TestCredential2", "jceks");
         assertEquals("PassworD123", password);
 
         String[] argsdeleteCommand = new String[] {"delete", 
"TestCredential2", "-provider", "jceks://file@/" + keystoreFile};
diff --git 
a/credentialbuilder/src/test/java/org/apache/ranger/credentialapi/Testbuildks.java
 
b/credentialbuilder/src/test/java/org/apache/ranger/credentialapi/Testbuildks.java
index 87634d7..c9fb54c 100644
--- 
a/credentialbuilder/src/test/java/org/apache/ranger/credentialapi/Testbuildks.java
+++ 
b/credentialbuilder/src/test/java/org/apache/ranger/credentialapi/Testbuildks.java
@@ -21,6 +21,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 import java.io.File;
+import java.util.Arrays;
 
 import org.apache.commons.io.FileUtils;
 import org.junit.After;
@@ -48,7 +49,7 @@ public class Testbuildks {
     @Test
     public void testBuildKSsuccess() throws Exception {
         buildks buildksOBJ = new buildks();
-        String[] argsCreateCommand = {"create", "TestCredential1", "-value", 
"PassworD123", "-provider", "jceks://file@/" + keystoreFile};
+        String[] argsCreateCommand = {"create", "TestCredential1", "-value", 
"PassworD123", "-provider", "jceks://file@/" + keystoreFile, "","jceks"};
         int rc1 = buildksOBJ.createCredential(argsCreateCommand);
         assertEquals(0, rc1);
 
@@ -57,6 +58,7 @@ public class Testbuildks {
         assertEquals(0, rc2);
 
         String[] argsGetCommand = {"get", "TestCredential1", "-provider", 
"jceks://file@/" +keystoreFile };
+        System.out.println("Get command = " + Arrays.toString(argsGetCommand));
         String pw = buildksOBJ.getCredential(argsGetCommand);
         assertEquals("PassworD123", pw);
         assertTrue(pw.equals("PassworD123"));
diff --git 
a/embeddedwebserver/src/main/java/org/apache/ranger/server/tomcat/ElasticSearchIndexBootStrapper.java
 
b/embeddedwebserver/src/main/java/org/apache/ranger/server/tomcat/ElasticSearchIndexBootStrapper.java
index e6eb7af..15a16e4 100644
--- 
a/embeddedwebserver/src/main/java/org/apache/ranger/server/tomcat/ElasticSearchIndexBootStrapper.java
+++ 
b/embeddedwebserver/src/main/java/org/apache/ranger/server/tomcat/ElasticSearchIndexBootStrapper.java
@@ -25,6 +25,7 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.security.KeyStore;
 import java.util.Locale;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
@@ -121,8 +122,9 @@ public class ElasticSearchIndexBootStrapper extends Thread {
 
                String providerPath = 
EmbeddedServerUtil.getConfig(ES_CREDENTIAL_PROVIDER_PATH);
                String credentialAlias = 
EmbeddedServerUtil.getConfig(ES_CREDENTIAL_ALIAS, ES_CONFIG_PASSWORD);
+               String keyStoreFileType = 
EmbeddedServerUtil.getConfig("ranger.keystore.file.type", 
KeyStore.getDefaultType());
                if (providerPath != null && credentialAlias != null) {
-                       password = 
CredentialReader.getDecryptedString(providerPath.trim(), 
credentialAlias.trim());
+                       password = 
CredentialReader.getDecryptedString(providerPath.trim(), 
credentialAlias.trim(), keyStoreFileType);
                        if (StringUtils.isBlank(password) || 
"none".equalsIgnoreCase(password.trim())) {
                                password = 
EmbeddedServerUtil.getConfig(ES_CONFIG_PASSWORD);
                        }
diff --git 
a/embeddedwebserver/src/main/java/org/apache/ranger/server/tomcat/EmbeddedServer.java
 
b/embeddedwebserver/src/main/java/org/apache/ranger/server/tomcat/EmbeddedServer.java
index 30d8305..757461d 100644
--- 
a/embeddedwebserver/src/main/java/org/apache/ranger/server/tomcat/EmbeddedServer.java
+++ 
b/embeddedwebserver/src/main/java/org/apache/ranger/server/tomcat/EmbeddedServer.java
@@ -75,8 +75,8 @@ public class EmbeddedServer {
        private static final String ADMIN_NAME_RULES = 
"hadoop.security.auth_to_local";
        private static final String ADMIN_SERVER_NAME = "rangeradmin";
        private static final String KMS_SERVER_NAME   = "rangerkms";
-       public static final String RANGER_KEYSTORE_FILE_TYPE_DEFAULT = "jks";
-       public static final String RANGER_TRUSTSTORE_FILE_TYPE_DEFAULT = "jks";
+       public static final String RANGER_KEYSTORE_FILE_TYPE_DEFAULT = 
KeyStore.getDefaultType();
+       public static final String RANGER_TRUSTSTORE_FILE_TYPE_DEFAULT = 
KeyStore.getDefaultType();
        public static final String RANGER_SSL_CONTEXT_ALGO_TYPE = "TLS";
        public static final String RANGER_SSL_KEYMANAGER_ALGO_TYPE = 
KeyManagerFactory.getDefaultAlgorithm();
        public static final String RANGER_SSL_TRUSTMANAGER_ALGO_TYPE = 
TrustManagerFactory.getDefaultAlgorithm();
@@ -152,6 +152,8 @@ public class EmbeddedServer {
                        ssl.setScheme("https");
                        ssl.setAttribute("SSLEnabled", "true");
                        ssl.setAttribute("sslProtocol", 
EmbeddedServerUtil.getConfig("ranger.service.https.attrib.ssl.protocol", 
"TLS"));
+                       ssl.setAttribute("keystoreType", 
EmbeddedServerUtil.getConfig("ranger.keystore.file.type", 
RANGER_KEYSTORE_FILE_TYPE_DEFAULT));
+                       ssl.setAttribute("truststoreType", 
EmbeddedServerUtil.getConfig("ranger.truststore.file.type", 
RANGER_TRUSTSTORE_FILE_TYPE_DEFAULT));
                        String clientAuth = 
EmbeddedServerUtil.getConfig("ranger.service.https.attrib.clientAuth", "false");
                        if("false".equalsIgnoreCase(clientAuth)){
                                clientAuth = 
EmbeddedServerUtil.getConfig("ranger.service.https.attrib.client.auth", "want");
@@ -161,7 +163,7 @@ public class EmbeddedServer {
                        String keyAlias = 
EmbeddedServerUtil.getConfig("ranger.service.https.attrib.keystore.credential.alias",
 "keyStoreCredentialAlias");
                        String keystorePass=null;
                        if(providerPath!=null && keyAlias!=null){
-                               keystorePass = 
CredentialReader.getDecryptedString(providerPath.trim(), keyAlias.trim());
+                               keystorePass = 
CredentialReader.getDecryptedString(providerPath.trim(), keyAlias.trim(), 
EmbeddedServerUtil.getConfig("ranger.keystore.file.type", 
RANGER_KEYSTORE_FILE_TYPE_DEFAULT));
                                if (StringUtils.isBlank(keystorePass) || 
"none".equalsIgnoreCase(keystorePass.trim())) {
                                        keystorePass = 
EmbeddedServerUtil.getConfig("ranger.service.https.attrib.keystore.pass");
                                }
@@ -432,8 +434,9 @@ public class EmbeddedServer {
                        keyStoreFile = getKeystoreFile();
                        keyStoreAlias = 
EmbeddedServerUtil.getConfig("ranger.service.https.attrib.keystore.credential.alias",
 "keyStoreCredentialAlias");
                }
+               String keyStoreFileType = 
EmbeddedServerUtil.getConfig("ranger.keystore.file.type",RANGER_KEYSTORE_FILE_TYPE_DEFAULT);
                String credentialProviderPath = 
EmbeddedServerUtil.getConfig("ranger.credential.provider.path");
-               String keyStoreFilepwd = 
CredentialReader.getDecryptedString(credentialProviderPath, keyStoreAlias);
+               String keyStoreFilepwd = 
CredentialReader.getDecryptedString(credentialProviderPath, keyStoreAlias, 
keyStoreFileType);
 
                if (StringUtils.isNotEmpty(keyStoreFile) && 
StringUtils.isNotEmpty(keyStoreFilepwd)) {
                        InputStream in = null;
@@ -442,11 +445,11 @@ public class EmbeddedServer {
                                in = getFileInputStream(keyStoreFile);
 
                                if (in != null) {
-                                       KeyStore keyStore = 
KeyStore.getInstance(RANGER_KEYSTORE_FILE_TYPE_DEFAULT);
+                                       KeyStore keyStore = 
KeyStore.getInstance(keyStoreFileType);
 
                                        keyStore.load(in, 
keyStoreFilepwd.toCharArray());
 
-                                       KeyManagerFactory keyManagerFactory = 
KeyManagerFactory.getInstance(RANGER_SSL_KEYMANAGER_ALGO_TYPE);
+                                       KeyManagerFactory keyManagerFactory = 
KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
 
                                        keyManagerFactory.init(keyStore, 
keyStoreFilepwd.toCharArray());
 
@@ -488,7 +491,8 @@ public class EmbeddedServer {
                String truststoreFile = 
EmbeddedServerUtil.getConfig("ranger.truststore.file");
                String truststoreAlias = 
EmbeddedServerUtil.getConfig("ranger.truststore.alias");
                String credentialProviderPath = 
EmbeddedServerUtil.getConfig("ranger.credential.provider.path");
-               String trustStoreFilepwd = 
CredentialReader.getDecryptedString(credentialProviderPath, truststoreAlias);
+               String truststoreFileType = 
EmbeddedServerUtil.getConfig("ranger.truststore.file.type",RANGER_TRUSTSTORE_FILE_TYPE_DEFAULT);
+               String trustStoreFilepwd = 
CredentialReader.getDecryptedString(credentialProviderPath, truststoreAlias, 
truststoreFileType);
 
                if (StringUtils.isNotEmpty(truststoreFile) && 
StringUtils.isNotEmpty(trustStoreFilepwd)) {
                        InputStream in = null;
@@ -497,7 +501,7 @@ public class EmbeddedServer {
                                in = getFileInputStream(truststoreFile);
 
                                if (in != null) {
-                                       KeyStore trustStore = 
KeyStore.getInstance(RANGER_TRUSTSTORE_FILE_TYPE_DEFAULT);
+                                       KeyStore trustStore = 
KeyStore.getInstance(truststoreFileType);
 
                                        trustStore.load(in, 
trustStoreFilepwd.toCharArray());
 
diff --git a/kms/src/main/java/org/apache/hadoop/crypto/key/JKS2RangerUtil.java 
b/kms/src/main/java/org/apache/hadoop/crypto/key/JKS2RangerUtil.java
index 75aa939..4324439 100644
--- a/kms/src/main/java/org/apache/hadoop/crypto/key/JKS2RangerUtil.java
+++ b/kms/src/main/java/org/apache/hadoop/crypto/key/JKS2RangerUtil.java
@@ -41,7 +41,7 @@ public class JKS2RangerUtil {
        private static final String AZURE_KEYVAULT_CERTIFICATE_PASSWORD = 
"ranger.kms.azure.keyvault.certificate.password";
        private static final String AZURE_CLIENT_SECRET_ALIAS = 
"ranger.kms.azure.client.secret.alias";
        private static final String CREDENTIAL_PATH = 
"ranger.ks.jpa.jdbc.credential.provider.path";
-       private static final String DEFAULT_KEYSTORE_TYPE = "jceks";
+       private static final String DEFAULT_KEYSTORE_TYPE = 
KeyStore.getDefaultType();
        private static final String ENCRYPTION_KEY = 
"ranger.db.encrypt.key.password";
        private static final String KEYSECURE_ENABLED = 
"ranger.kms.keysecure.enabled";
        private static final String KEYSECURE_USERNAME = 
"ranger.kms.keysecure.login.username";
@@ -74,7 +74,7 @@ public class JKS2RangerUtil {
                                System.exit(1);
                        }
                        String keyStoreType = (args.length == 2 ? args[1]
-                                       : DEFAULT_KEYSTORE_TYPE);
+                                       : KeyStore.getDefaultType());
                        try {
                                KeyStore.getInstance(keyStoreType);
                        } catch (KeyStoreException e) {
@@ -105,7 +105,7 @@ public class JKS2RangerUtil {
                        String aliasValue = conf.get(alias);
                        if (pathValue != null && aliasValue != null) {
                                String xaDBPassword = 
CredentialReader.getDecryptedString(
-                                               pathValue.trim(), 
aliasValue.trim());
+                                               pathValue.trim(), 
aliasValue.trim(), KeyStore.getDefaultType());
                                if (xaDBPassword != null && 
!xaDBPassword.trim().isEmpty()
                                                && 
!xaDBPassword.trim().equalsIgnoreCase("none")) {
                                        conf.set(key, xaDBPassword);
diff --git 
a/kms/src/main/java/org/apache/hadoop/crypto/key/KeySecureToRangerDBMKUtil.java 
b/kms/src/main/java/org/apache/hadoop/crypto/key/KeySecureToRangerDBMKUtil.java
index 538fde9..7fafa10 100644
--- 
a/kms/src/main/java/org/apache/hadoop/crypto/key/KeySecureToRangerDBMKUtil.java
+++ 
b/kms/src/main/java/org/apache/hadoop/crypto/key/KeySecureToRangerDBMKUtil.java
@@ -16,6 +16,8 @@
  */
 package org.apache.hadoop.crypto.key;
 
+import java.security.KeyStore;
+
 import org.apache.hadoop.conf.Configuration;
 import org.apache.ranger.credentialapi.CredentialReader;
 import org.apache.ranger.kms.dao.DaoManager;
@@ -91,7 +93,7 @@ public class KeySecureToRangerDBMKUtil {
             String pathValue = conf.get(path);
             String aliasValue = conf.get(alias);
             if (pathValue != null && aliasValue != null) {
-                String xaDBPassword = 
CredentialReader.getDecryptedString(pathValue.trim(), aliasValue.trim());
+                String xaDBPassword = 
CredentialReader.getDecryptedString(pathValue.trim(), aliasValue.trim(), 
KeyStore.getDefaultType());
                 if (xaDBPassword != null && !xaDBPassword.trim().isEmpty() &&
                         !xaDBPassword.trim().equalsIgnoreCase("none")) {
                     conf.set(key, xaDBPassword);
diff --git a/kms/src/main/java/org/apache/hadoop/crypto/key/Ranger2JKSUtil.java 
b/kms/src/main/java/org/apache/hadoop/crypto/key/Ranger2JKSUtil.java
index 6e4f75a..1935a01 100644
--- a/kms/src/main/java/org/apache/hadoop/crypto/key/Ranger2JKSUtil.java
+++ b/kms/src/main/java/org/apache/hadoop/crypto/key/Ranger2JKSUtil.java
@@ -41,7 +41,7 @@ public class Ranger2JKSUtil {
        private static final String AZURE_KEYVAULT_CERTIFICATE_PATH = 
"ranger.kms.azure.keyvault.certificate.path";
        private static final String AZURE_KEYVAULT_CERTIFICATE_PASSWORD = 
"ranger.kms.azure.keyvault.certificate.password";
        private static final String CREDENTIAL_PATH = 
"ranger.ks.jpa.jdbc.credential.provider.path";
-       private static final String DEFAULT_KEYSTORE_TYPE = "jceks";
+       private static final String DEFAULT_KEYSTORE_TYPE = 
KeyStore.getDefaultType();
        private static final String ENCRYPTION_KEY = 
"ranger.db.encrypt.key.password";
        private static final String KEYSECURE_ENABLED = 
"ranger.kms.keysecure.enabled";
        private static final String KEYSECURE_USERNAME = 
"ranger.kms.keysecure.login.username";
@@ -222,7 +222,7 @@ public class Ranger2JKSUtil {
                        String aliasValue = conf.get(alias);
                        if (pathValue != null && aliasValue != null) {
                                String xaDBPassword = 
CredentialReader.getDecryptedString(
-                                               pathValue.trim(), 
aliasValue.trim());
+                                               pathValue.trim(), 
aliasValue.trim(), KeyStore.getDefaultType());
                                if (xaDBPassword != null && 
!xaDBPassword.trim().isEmpty()
                                                && 
!xaDBPassword.trim().equalsIgnoreCase("none")) {
                                        conf.set(key, xaDBPassword);
diff --git 
a/kms/src/main/java/org/apache/hadoop/crypto/key/RangerKeyStoreProvider.java 
b/kms/src/main/java/org/apache/hadoop/crypto/key/RangerKeyStoreProvider.java
index 7473871..011318b 100755
--- a/kms/src/main/java/org/apache/hadoop/crypto/key/RangerKeyStoreProvider.java
+++ b/kms/src/main/java/org/apache/hadoop/crypto/key/RangerKeyStoreProvider.java
@@ -26,6 +26,7 @@ import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URL;
 import java.security.Key;
+import java.security.KeyStore;
 import java.security.KeyStoreException;
 import java.security.NoSuchAlgorithmException;
 import java.security.UnrecoverableKeyException;
@@ -619,8 +620,9 @@ public class RangerKeyStoreProvider extends KeyProvider {
                        String pathValue = conf.get(path);
                        String aliasValue = conf.get(alias);
                        if (pathValue != null && aliasValue != null) {
+                               String storeType = 
conf.get("ranger.keystore.file.type", KeyStore.getDefaultType());
                                String xaDBPassword = 
CredentialReader.getDecryptedString(
-                                               pathValue.trim(), 
aliasValue.trim());
+                                               pathValue.trim(), 
aliasValue.trim(), storeType);
                                if (xaDBPassword != null && 
!xaDBPassword.trim().isEmpty()
                                                && 
!xaDBPassword.trim().equalsIgnoreCase("none")) {
                                        conf.set(key, xaDBPassword);
diff --git 
a/kms/src/main/java/org/apache/hadoop/crypto/key/RangerMasterKey.java 
b/kms/src/main/java/org/apache/hadoop/crypto/key/RangerMasterKey.java
index 2b4eb80..adb2c26 100755
--- a/kms/src/main/java/org/apache/hadoop/crypto/key/RangerMasterKey.java
+++ b/kms/src/main/java/org/apache/hadoop/crypto/key/RangerMasterKey.java
@@ -18,6 +18,7 @@
 package org.apache.hadoop.crypto.key;
 
 import java.security.Key;
+import java.security.KeyStore;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
@@ -56,9 +57,9 @@ public class RangerMasterKey implements RangerKMSMKI {
     private static final int DEFAULT_SALT_SIZE = 8;
     private static final String DEFAULT_SALT = 
"abcdefghijklmnopqrstuvwxyz01234567890";
     private static final String DEFAULT_CRYPT_ALGO = "PBEWithMD5AndTripleDES";
-    private static final String DEFAULT_MD_ALGO = "MD5";
     private static final int DEFAULT_ITERATION_COUNT = 1000;
     private static String password = null;
+    private static String DEFAULT_MD_ALGO;
 
     public static final String DBKS_SITE_XML = "dbks-site.xml";
     private static Properties serverConfigProperties = new Properties();
@@ -177,6 +178,7 @@ public class RangerMasterKey implements RangerKMSMKI {
             logger.debug("==> RangerMasterKey.init()");
         }
         XMLUtils.loadConfig(DBKS_SITE_XML, serverConfigProperties);
+        DEFAULT_MD_ALGO = getConfig("ranger.keystore.file.type", 
KeyStore.getDefaultType()).equalsIgnoreCase("bcfks") ? "SHA-512" : "MD5";
         MK_CIPHER = getConfig("ranger.kms.service.masterkey.password.cipher", 
DEFAULT_MK_CIPHER);
         MK_KeySize = 
getIntConfig("ranger.kms.service.masterkey.password.size", DEFAULT_MK_KeySize);
         SALT_SIZE = 
getIntConfig("ranger.kms.service.masterkey.password.salt.size", 
DEFAULT_SALT_SIZE);
diff --git a/ranger-util/src/scripts/saveVersion.py 
b/ranger-util/src/scripts/saveVersion.py
index 0ad39ac..5122754 100644
--- a/ranger-util/src/scripts/saveVersion.py
+++ b/ranger-util/src/scripts/saveVersion.py
@@ -103,11 +103,11 @@ def main():
 
        sortedList = sorted(fileList, key = lambda x: x[:-4])
        for _, val in enumerate(sortedList):
-               m = hashfile(open(val,'rb'), hashlib.md5())
+               m = hashfile(open(val,'rb'), hashlib.sha512())
                f = m +"  "+ val + "\n"
                c.append(f)
 
-       srcChecksum = hashlib.md5(''.join(c).encode('UTF-8')).hexdigest()
+       srcChecksum = hashlib.sha512(''.join(c).encode('UTF-8')).hexdigest()
        print('hash of the ' + str(len(sortedList)) + '\n\t file from: ' + 
parent_dir + '\n\t is ' + srcChecksum)
 
        dir = 
os.path.join(src_dir,"target","gen","org","apache","ranger","common")
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/UserMgr.java 
b/security-admin/src/main/java/org/apache/ranger/biz/UserMgr.java
index 2b3cdcb..3182a28 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/UserMgr.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/UserMgr.java
@@ -28,6 +28,7 @@ import javax.persistence.Query;
 import javax.servlet.http.HttpServletResponse;
 import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
+import org.apache.ranger.authorization.hadoop.config.RangerAdminConfig;
 import org.apache.ranger.common.AppConstants;
 import org.apache.ranger.common.ContextUtil;
 import org.apache.ranger.common.DateUtil;
@@ -52,6 +53,7 @@ import org.apache.ranger.entity.XXUserPermission;
 import org.apache.ranger.service.XGroupPermissionService;
 import org.apache.ranger.service.XPortalUserService;
 import org.apache.ranger.service.XUserPermissionService;
+import org.apache.ranger.util.Pbkdf2PasswordEncoderCust;
 import org.apache.ranger.view.VXGroupPermission;
 import org.apache.ranger.view.VXPasswordChange;
 import org.apache.ranger.view.VXPortalUser;
@@ -116,6 +118,8 @@ public class UserMgr {
 
        @Autowired
        GUIDUtil guidUtil;
+
+       private final boolean isFipsEnabled;
        
        String publicRoles[] = new String[] { RangerConstants.ROLE_USER,
                        RangerConstants.ROLE_OTHER };
@@ -138,6 +142,7 @@ public class UserMgr {
                if (logger.isDebugEnabled()) {
                        logger.debug("UserMgr()");
                }
+               this.isFipsEnabled = 
RangerAdminConfig.getInstance().isFipsEnabled();
        }
 
        public XXPortalUser createUser(VXPortalUser userProfile, int userStatus,
@@ -414,13 +419,21 @@ public class UserMgr {
             vXResponse.setMsgDesc("SECURITY:changePassword().Ranger External 
Users cannot change password. LoginId=" + pwdChange.getLoginId());
             throw restErrorUtil.generateRESTException(vXResponse);
         }
+        
+        String currentPassword = gjUser.getPassword();
                //check current password and provided old password is same or 
not
-               String encryptedOldPwd = 
encrypt(pwdChange.getLoginId(),pwdChange.getOldPassword());
-               if (!stringUtil.equals(encryptedOldPwd, gjUser.getPassword())) {
-                       logger.info("changePassword(). Invalid old password. 
LoginId="+ pwdChange.getLoginId());
-                       throw 
restErrorUtil.createRESTException("validationMessages.oldPasswordError",MessageEnums.INVALID_INPUT_DATA,
 null, null,pwdChange.getLoginId());
-               }
-
+               if (this.isFipsEnabled) {
+                       if (!isPasswordValid(pwdChange.getLoginId(), 
currentPassword, pwdChange.getOldPassword())) {
+                               logger.info("changePassword(). Invalid old 
password. LoginId="+ pwdChange.getLoginId());
+                               throw 
restErrorUtil.createRESTException("serverMsg.userMgrOldPassword",MessageEnums.INVALID_INPUT_DATA,
 null, null,pwdChange.getLoginId());
+                               }
+                       } else {
+                               String encryptedOldPwd = 
encrypt(pwdChange.getLoginId(),pwdChange.getOldPassword());
+                               if (!stringUtil.equals(encryptedOldPwd, 
gjUser.getPassword())) {
+                                       logger.info("changePassword(). Invalid 
old password. LoginId="+ pwdChange.getLoginId());
+                                       throw 
restErrorUtil.createRESTException("serverMsg.userMgrOldPassword",MessageEnums.INVALID_INPUT_DATA,
 null, null,pwdChange.getLoginId());
+                               }
+                       }
                //validate new password
                if (!stringUtil.validatePassword(pwdChange.getUpdPassword(),new 
String[] { gjUser.getFirstName(),gjUser.getLastName(), gjUser.getLoginId()})) {
                        logger.warn("SECURITY:changePassword(). Invalid new 
password. LoginId="+ pwdChange.getLoginId());
@@ -428,27 +441,34 @@ public class UserMgr {
                }
 
                String encryptedNewPwd = 
encrypt(pwdChange.getLoginId(),pwdChange.getUpdPassword());
-               String currentPassword = gjUser.getPassword();
-               if (!encryptedNewPwd.equals(currentPassword)) {
-                       List<XXTrxLog> trxLogList = new ArrayList<XXTrxLog>();
-                       XXTrxLog xTrxLog = new XXTrxLog();
-                       xTrxLog.setAttributeName("Password");
-                       xTrxLog.setPreviousValue(currentPassword);
-                       xTrxLog.setNewValue(encryptedNewPwd);
-                       xTrxLog.setAction("password change");
-                       
xTrxLog.setObjectClassType(AppConstants.CLASS_TYPE_PASSWORD_CHANGE);
-                       xTrxLog.setObjectId(pwdChange.getId());
-                       xTrxLog.setObjectName(pwdChange.getLoginId());
-                       trxLogList.add(xTrxLog);
-                        rangerBizUtil.createTrxLog(trxLogList);
-                       gjUser.setPassword(encryptedNewPwd);
-                       gjUser = daoManager.getXXPortalUser().update(gjUser);
-                       ret.setMsgDesc("Password successfully updated");
-                       ret.setStatusCode(VXResponse.STATUS_SUCCESS);
-               } else {
-                       ret.setMsgDesc("Password update failed");
-                       ret.setStatusCode(VXResponse.STATUS_ERROR);
-                       throw 
restErrorUtil.createRESTException("serverMsg.userMgrOldPassword",MessageEnums.INVALID_INPUT_DATA,
 gjUser.getId(),"password", gjUser.toString());
+               //check current password and provided new password different
+               boolean isNewPasswordDifferent;
+               if (this.isFipsEnabled) {
+                               isNewPasswordDifferent = 
isNewPasswordDifferent(pwdChange.getLoginId(), pwdChange.getOldPassword(), 
pwdChange.getUpdPassword());
+                       } else {
+                               isNewPasswordDifferent = 
!encryptedNewPwd.equals(currentPassword);
+                       }
+                       if (isNewPasswordDifferent) {
+                               List<XXTrxLog> trxLogList = new 
ArrayList<XXTrxLog>();
+                               XXTrxLog xTrxLog = new XXTrxLog();
+                               xTrxLog.setAttributeName("Password");
+                               xTrxLog.setPreviousValue(currentPassword);
+                               xTrxLog.setNewValue(encryptedNewPwd);
+                               xTrxLog.setAction("password change");
+                               
xTrxLog.setObjectClassType(AppConstants.CLASS_TYPE_PASSWORD_CHANGE);
+                               xTrxLog.setObjectId(pwdChange.getId());
+                               xTrxLog.setObjectName(pwdChange.getLoginId());
+                               trxLogList.add(xTrxLog);
+                               rangerBizUtil.createTrxLog(trxLogList);
+                               gjUser.setPassword(encryptedNewPwd);
+                               gjUser = 
daoManager.getXXPortalUser().update(gjUser);
+                               ret.setMsgDesc("Password successfully updated");
+                               ret.setStatusCode(VXResponse.STATUS_SUCCESS);
+                       } else {
+                               logger.error("SECURITY:changePassword(). 
Password update failed. LoginId="+ pwdChange.getLoginId());
+                               ret.setMsgDesc("Password update failed");
+                               ret.setStatusCode(VXResponse.STATUS_ERROR);
+                               throw 
restErrorUtil.createRESTException("serverMsg.userMgrOldPassword",MessageEnums.INVALID_INPUT_DATA,
 gjUser.getId(),"password", gjUser.toString());
                }
                return ret;
        }
@@ -466,9 +486,6 @@ public class UserMgr {
                        changeEmail.setEmailAddress(null);
                }
 
-               String encryptedOldPwd = encrypt(gjUser.getLoginId(),
-                               changeEmail.getOldPassword());
-
                if (!StringUtils.isEmpty(changeEmail.getEmailAddress()) && 
!stringUtil.validateEmail(changeEmail.getEmailAddress())) {
                        logger.info("Invalid email address." + changeEmail);
                        throw restErrorUtil.createRESTException(
@@ -477,16 +494,27 @@ public class UserMgr {
                                        "emailAddress", changeEmail.toString());
 
                }
-
-               if (!stringUtil.equals(encryptedOldPwd, gjUser.getPassword())) {
-                       logger.info("changeEmailAddress(). Invalid  password. 
changeEmail="
-                                       + changeEmail);
-
-                       throw restErrorUtil.createRESTException(
-                                       "serverMsg.userMgrWrongPassword",
-                                       MessageEnums.OPER_NO_PERMISSION, null, 
null, ""
+               
+               if (this.isFipsEnabled) {
+                       if (!isPasswordValid(changeEmail.getLoginId(), 
gjUser.getPassword(), changeEmail.getOldPassword())) {
+                               logger.info("changeEmailAddress(). Invalid  
password. changeEmail="
+                                                               + changeEmail);
+                                                               throw 
restErrorUtil.createRESTException(
+                                                                               
        "serverMsg.userMgrWrongPassword",
+                                                                               
                MessageEnums.OPER_NO_PERMISSION, null, null, ""
+                                                                               
                                + changeEmail);
+                                       }
+                       } else {
+                               String encryptedOldPwd = 
encrypt(gjUser.getLoginId(), changeEmail.getOldPassword());
+                               if (!stringUtil.equals(encryptedOldPwd, 
gjUser.getPassword())) {
+                                       logger.info("changeEmailAddress(). 
Invalid  password. changeEmail="
                                                        + changeEmail);
-               }
+                                       throw restErrorUtil.createRESTException(
+                                                       
"serverMsg.userMgrWrongPassword",
+                                                       
MessageEnums.OPER_NO_PERMISSION, null, null, ""
+                                                                       + 
changeEmail);
+                               }
+                       }
 
                // Normalize email. Make it lower case
                gjUser.setEmailAddress(stringUtil.normalizeEmail(changeEmail
@@ -1100,13 +1128,30 @@ public class UserMgr {
        }
 
        public String encrypt(String loginId, String password) {
-               String 
sha256PasswordUpdateDisable=PropertiesUtil.getProperty("ranger.sha256Password.update.disable",
 "false");
-               String saltEncodedpasswd="";
-               if("false".equalsIgnoreCase(sha256PasswordUpdateDisable)){
-                       saltEncodedpasswd = 
sha256Encoder.encodePassword(password, loginId);
-               }else{
-                       saltEncodedpasswd = md5Encoder.encodePassword(password, 
loginId);
+               String saltEncodedpasswd = "";
+               if (this.isFipsEnabled) {
+                       try {
+                               Pbkdf2PasswordEncoderCust pbkdf2Encoder = new 
Pbkdf2PasswordEncoderCust(loginId);
+                               pbkdf2Encoder.setEncodeHashAsBase64(true);
+                               if (password != null) {
+                                       saltEncodedpasswd = 
pbkdf2Encoder.encode(password);
+                               }
+                       } catch (Throwable t) {
+                                       logger.error("Password doesn't meet 
requirements");
+                                       throw 
restErrorUtil.createRESTException("Invalid password",
+                                                       
MessageEnums.INVALID_PASSWORD, null, null, ""
+                                                                       + 
loginId);
+                       }
+               } else {
+                       String sha256PasswordUpdateDisable = 
PropertiesUtil.getProperty("ranger.sha256Password.update.disable", "false");
+
+                       if 
("false".equalsIgnoreCase(sha256PasswordUpdateDisable)) {
+                               saltEncodedpasswd = 
sha256Encoder.encodePassword(password, loginId);
+                       } else {
+                               saltEncodedpasswd = 
md5Encoder.encodePassword(password, loginId);
+                       }
                }
+               
                return saltEncodedpasswd;
        }
 
@@ -1424,4 +1469,38 @@ public class UserMgr {
                 rangerBizUtil.createTrxLog(trxLogList);
                 return xXPortalUser;
         }
-}
+        public boolean isPasswordValid(String loginId, String encodedPassword, 
String password) {
+                               boolean isPasswordValid = false;
+                               try {
+                                       Pbkdf2PasswordEncoderCust pbkdf2Encoder 
= new Pbkdf2PasswordEncoderCust(loginId);
+                                       
pbkdf2Encoder.setEncodeHashAsBase64(true);
+                                       
+                                       if (pbkdf2Encoder.matches(password, 
encodedPassword)) {
+                                               isPasswordValid = true;
+                                       }
+                               } catch (Throwable t) {
+                                       logger.error("Unable to validate old 
password ", t);
+                               }
+               
+                               return isPasswordValid;
+                       }
+        
+        public boolean isNewPasswordDifferent(String loginId, String 
currentPassword, String newPassword) {
+                               boolean isNewPasswordDifferent = true;
+                               String saltEncodedpasswd = "";
+                               try {
+                                       Pbkdf2PasswordEncoderCust pbkdf2Encoder 
= new Pbkdf2PasswordEncoderCust(loginId);
+                                       
pbkdf2Encoder.setEncodeHashAsBase64(true);
+                                       if (currentPassword != null) {
+                                               saltEncodedpasswd = 
pbkdf2Encoder.encode(currentPassword);
+                               }
+                                       if (pbkdf2Encoder.matches(newPassword, 
saltEncodedpasswd)) {
+                                               isNewPasswordDifferent = false;
+                                       }
+                               } catch (Throwable t) {
+                                       logger.error("Unable to validate old 
and new passwords ", t);
+                               }
+               
+                               return isNewPasswordDifferent;
+               }
+       }
\ No newline at end of file
diff --git 
a/security-admin/src/main/java/org/apache/ranger/common/PropertiesUtil.java 
b/security-admin/src/main/java/org/apache/ranger/common/PropertiesUtil.java
index c58258b..fb892d5 100644
--- a/security-admin/src/main/java/org/apache/ranger/common/PropertiesUtil.java
+++ b/security-admin/src/main/java/org/apache/ranger/common/PropertiesUtil.java
@@ -72,7 +72,8 @@ public class PropertiesUtil extends 
PropertyPlaceholderConfigurer {
            String keyStr = key.toString();
            propertiesMap.put(keyStr, props.getProperty(keyStr).trim());
        }
-       
+
+       String storeType = propertiesMap.get("ranger.keystore.file.type");
        // update system trust store path with custom trust store.
        if (propertiesMap!=null && 
propertiesMap.containsKey("ranger.truststore.file")) {
                
if(!StringUtils.isEmpty(propertiesMap.get("ranger.truststore.file"))){
@@ -86,7 +87,7 @@ public class PropertiesUtil extends 
PropertyPlaceholderConfigurer {
                                        String 
path=propertiesMap.get("ranger.credential.provider.path");
                                        String 
trustStoreAlias=getProperty("ranger.truststore.alias","trustStoreAlias");
                                        if(path!=null && trustStoreAlias!=null){
-                                               String 
trustStorePassword=CredentialReader.getDecryptedString(path.trim(), 
trustStoreAlias.trim());
+                                               String 
trustStorePassword=CredentialReader.getDecryptedString(path.trim(), 
trustStoreAlias.trim(), storeType);
                                                if(trustStorePassword!=null&& 
!trustStorePassword.trim().isEmpty() && 
!trustStorePassword.trim().equalsIgnoreCase("none")){
                                                        
propertiesMap.put("ranger.truststore.password", trustStorePassword);
                                                        
props.put("ranger.truststore.password", trustStorePassword);
@@ -113,7 +114,7 @@ public class PropertiesUtil extends 
PropertyPlaceholderConfigurer {
                                        String 
path=propertiesMap.get("ranger.credential.provider.path");
                                        String 
keyStoreAlias=getProperty("ranger.keystore.alias","keyStoreAlias");
                                        if(path!=null && keyStoreAlias!=null){
-                                               String 
keyStorePassword=CredentialReader.getDecryptedString(path.trim(), 
keyStoreAlias.trim());
+                                               String 
keyStorePassword=CredentialReader.getDecryptedString(path.trim(), 
keyStoreAlias.trim(), storeType);
                                                if(keyStorePassword!=null&& 
!keyStorePassword.trim().isEmpty() && 
!keyStorePassword.trim().equalsIgnoreCase("none")){
                                                        
propertiesMap.put("ranger.keystore.password", keyStorePassword);
                                                        
props.put("ranger.keystore.password", keyStorePassword);
@@ -133,7 +134,7 @@ public class PropertiesUtil extends 
PropertyPlaceholderConfigurer {
                if(path!=null){
                        String 
unixAuthKeyStoreAlias=getProperty("ranger.unixauth.keystore.alias","unixAuthKeyStoreAlias");
                        if(unixAuthKeyStoreAlias!=null){
-                               String 
unixAuthKeyStorePass=CredentialReader.getDecryptedString(path.trim(),unixAuthKeyStoreAlias.trim());
+                               String 
unixAuthKeyStorePass=CredentialReader.getDecryptedString(path.trim(),unixAuthKeyStoreAlias.trim(),
 storeType);
                                if(unixAuthKeyStorePass!=null&& 
!unixAuthKeyStorePass.trim().isEmpty() 
&&!unixAuthKeyStorePass.trim().equalsIgnoreCase("none")){
                                        
propertiesMap.put("ranger.unixauth.keystore.password", unixAuthKeyStorePass);
                                        
props.put("ranger.unixauth.keystore.password", unixAuthKeyStorePass);
@@ -144,7 +145,7 @@ public class PropertiesUtil extends 
PropertyPlaceholderConfigurer {
                        //
                        String 
unixAuthTrustStoreAlias=getProperty("ranger.unixauth.truststore.alias","unixAuthTrustStoreAlias");
                        if(unixAuthTrustStoreAlias!=null){
-                               String 
unixAuthTrustStorePass=CredentialReader.getDecryptedString(path.trim(),unixAuthTrustStoreAlias.trim());
+                               String 
unixAuthTrustStorePass=CredentialReader.getDecryptedString(path.trim(),unixAuthTrustStoreAlias.trim(),
 storeType);
                                if(unixAuthTrustStorePass!=null&& 
!unixAuthTrustStorePass.trim().isEmpty() 
&&!unixAuthTrustStorePass.trim().equalsIgnoreCase("none")){
                                        
propertiesMap.put("ranger.unixauth.truststore.password", 
unixAuthTrustStorePass);
                                        
props.put("ranger.unixauth.truststore.password", unixAuthTrustStorePass);
@@ -160,7 +161,7 @@ public class PropertiesUtil extends 
PropertyPlaceholderConfigurer {
                String 
path=propertiesMap.get("ranger.credential.provider.path");
                String 
alias=propertiesMap.get("ranger.jpa.jdbc.credential.alias");
                if(path!=null && alias!=null){
-                       String 
xaDBPassword=CredentialReader.getDecryptedString(path.trim(),alias.trim());
+                       String 
xaDBPassword=CredentialReader.getDecryptedString(path.trim(),alias.trim(), 
storeType);
                        if(xaDBPassword!=null&& !xaDBPassword.trim().isEmpty() 
&&
                                        
!"none".equalsIgnoreCase(xaDBPassword.trim())){
                                propertiesMap.put("ranger.jpa.jdbc.password", 
xaDBPassword);
@@ -174,7 +175,7 @@ public class PropertiesUtil extends 
PropertyPlaceholderConfigurer {
                String 
path=propertiesMap.get("ranger.credential.provider.path");
                String 
alias=propertiesMap.get("ranger.jpa.audit.jdbc.credential.alias");
                if(path!=null && alias!=null){
-                       String 
auditDBPassword=CredentialReader.getDecryptedString(path.trim(), alias.trim());
+                       String 
auditDBPassword=CredentialReader.getDecryptedString(path.trim(), alias.trim(), 
storeType);
                        if(auditDBPassword!=null&& 
!auditDBPassword.trim().isEmpty() &&
                                        
!"none".equalsIgnoreCase(auditDBPassword.trim())){
                                
propertiesMap.put("ranger.jpa.audit.jdbc.password", auditDBPassword);
@@ -191,7 +192,7 @@ public class PropertiesUtil extends 
PropertyPlaceholderConfigurer {
                                String 
path=propertiesMap.get("ranger.credential.provider.path");
                                String 
alias=propertiesMap.get("ranger.ldap.ad.binddn.credential.alias");
                                if(path!=null && alias!=null){
-                                       String 
bindDNPassword=CredentialReader.getDecryptedString(path.trim(), alias.trim());
+                                       String 
bindDNPassword=CredentialReader.getDecryptedString(path.trim(), alias.trim(), 
storeType);
                                        if(bindDNPassword!=null&& 
!bindDNPassword.trim().isEmpty() &&
                                                        
!"none".equalsIgnoreCase(bindDNPassword.trim())){
                                                
propertiesMap.put("ranger.ldap.ad.bind.password", bindDNPassword);
@@ -210,7 +211,7 @@ public class PropertiesUtil extends 
PropertyPlaceholderConfigurer {
                                String 
path=propertiesMap.get("ranger.credential.provider.path");
                                String 
alias=propertiesMap.get("ranger.ldap.binddn.credential.alias");
                                if(path!=null && alias!=null){
-                                       String 
bindDNPassword=CredentialReader.getDecryptedString(path.trim(), alias.trim());
+                                       String 
bindDNPassword=CredentialReader.getDecryptedString(path.trim(), alias.trim(), 
storeType);
                                        if(bindDNPassword!=null&& 
!bindDNPassword.trim().isEmpty() &&
                                                        
!"none".equalsIgnoreCase(bindDNPassword.trim())){
                                                
propertiesMap.put("ranger.ldap.bind.password", bindDNPassword);
@@ -229,7 +230,7 @@ public class PropertiesUtil extends 
PropertyPlaceholderConfigurer {
                                String 
path=propertiesMap.get("ranger.credential.provider.path");
                                String 
alias=propertiesMap.get("ranger.solr.audit.credential.alias");
                                if(path!=null && alias!=null){
-                                       String 
solrAuditPassword=CredentialReader.getDecryptedString(path.trim(), 
alias.trim());
+                                       String 
solrAuditPassword=CredentialReader.getDecryptedString(path.trim(), 
alias.trim(), storeType);
                                        if(solrAuditPassword!=null&& 
!solrAuditPassword.trim().isEmpty() &&
                                                        
!"none".equalsIgnoreCase(solrAuditPassword.trim())){
                                                
propertiesMap.put("ranger.solr.audit.user.password", solrAuditPassword);
diff --git 
a/security-admin/src/main/java/org/apache/ranger/credentialapi/CredentialReader.java
 
b/security-admin/src/main/java/org/apache/ranger/credentialapi/CredentialReader.java
index 1a3ade7..f63828c 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/credentialapi/CredentialReader.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/credentialapi/CredentialReader.java
@@ -20,42 +20,55 @@
  package org.apache.ranger.credentialapi;
 import java.util.ArrayList;
 import java.util.List;
-
+import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.security.alias.CredentialProvider;
 import org.apache.hadoop.security.alias.CredentialProviderFactory;
 import org.apache.hadoop.security.alias.JavaKeyStoreProvider;
-
 public class CredentialReader {
-       
-       public static String getDecryptedString(String 
CrendentialProviderPath,String alias) {
+
+       public static String getDecryptedString(String 
CrendentialProviderPath,String alias, String storeType) {
                  String credential=null;
                  try{
                          if(CrendentialProviderPath==null || 
alias==null||CrendentialProviderPath.trim().isEmpty()||alias.trim().isEmpty()){
                                  return null;
-                         }                             
+                         }
                          char[] pass = null;
                          Configuration conf = new Configuration();
                          String 
crendentialProviderPrefixJceks=JavaKeyStoreProvider.SCHEME_NAME + "://file";
                          String 
crendentialProviderPrefixLocalJceks="localjceks://file";
                          
crendentialProviderPrefixJceks=crendentialProviderPrefixJceks.toLowerCase();
+
+                         String crendentialProviderPrefixBcfks= "bcfks" + 
"://file";
+                         String crendentialProviderPrefixLocalBcfks= 
"localbcfks" + "://file";
+                         
crendentialProviderPrefixBcfks=crendentialProviderPrefixBcfks.toLowerCase();
+                         
crendentialProviderPrefixLocalBcfks=crendentialProviderPrefixLocalBcfks.toLowerCase();
+
                          
CrendentialProviderPath=CrendentialProviderPath.trim();
                          alias=alias.trim();
-                         
if(CrendentialProviderPath.toLowerCase().startsWith(crendentialProviderPrefixJceks)
 ||  
CrendentialProviderPath.toLowerCase().startsWith(crendentialProviderPrefixLocalJceks)){
+                         
if(CrendentialProviderPath.toLowerCase().startsWith(crendentialProviderPrefixJceks)
 ||
+                                         
CrendentialProviderPath.toLowerCase().startsWith(crendentialProviderPrefixLocalJceks)
 ||
+                                         
CrendentialProviderPath.toLowerCase().startsWith(crendentialProviderPrefixBcfks)
 ||
+                                         
CrendentialProviderPath.toLowerCase().startsWith(crendentialProviderPrefixLocalBcfks)){
                                  
conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH,
-                                                  //UserProvider.SCHEME_NAME + 
":///," +
-                                 CrendentialProviderPath);
+                                                 //UserProvider.SCHEME_NAME + 
":///," +
+                                                 CrendentialProviderPath);
                          }else{
                                  if(CrendentialProviderPath.startsWith("/")){
-                                         
conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH,
-                                                          
//UserProvider.SCHEME_NAME + ":///," +
-                                         JavaKeyStoreProvider.SCHEME_NAME + 
"://file" + CrendentialProviderPath);
+                                         
if(StringUtils.equalsIgnoreCase(storeType, "bcfks")) {
+                                                 
conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH, 
CrendentialProviderPath);
+                                         } else {
+                                                 
conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH,
+                                                                 
//UserProvider.SCHEME_NAME + ":///," +
+                                                                 
JavaKeyStoreProvider.SCHEME_NAME + "://file" + CrendentialProviderPath);
+                                         }
+
                                  }else{
                                          
conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH,
-                                                          
//UserProvider.SCHEME_NAME + ":///," +
-                                         JavaKeyStoreProvider.SCHEME_NAME + 
"://file/" + CrendentialProviderPath);
+                                                         
//UserProvider.SCHEME_NAME + ":///," +
+                                                         
JavaKeyStoreProvider.SCHEME_NAME + "://file/" + CrendentialProviderPath);
                                  }
-                         }             
+                         }
                          List<CredentialProvider> providers = 
CredentialProviderFactory.getProviders(conf);
                          List<String> aliasesList=new ArrayList<String>();
                          CredentialProvider.CredentialEntry credEntry=null;
@@ -64,7 +77,7 @@ public class CredentialReader {
                                  aliasesList=provider.getAliases();
                                  if(aliasesList!=null && 
aliasesList.contains(alias.toLowerCase())){
                                          credEntry=null;
-                                         credEntry= 
provider.getCredentialEntry(alias);
+                                         credEntry= 
provider.getCredentialEntry(alias.toLowerCase());
                                          pass = credEntry.getCredential();
                                          if(pass!=null && pass.length>0){
                                                  
credential=String.valueOf(pass);
@@ -78,4 +91,4 @@ public class CredentialReader {
                  }
                  return credential;
          }
-}
\ No newline at end of file
+}
diff --git 
a/security-admin/src/main/java/org/apache/ranger/patch/cliutil/ChangePasswordUtil.java
 
b/security-admin/src/main/java/org/apache/ranger/patch/cliutil/ChangePasswordUtil.java
index e7a0853..8b9549a 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/patch/cliutil/ChangePasswordUtil.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/patch/cliutil/ChangePasswordUtil.java
@@ -132,30 +132,50 @@ public class ChangePasswordUtil extends BaseLoader {
                        String currentEncryptedPassword = null;
                        String md5EncryptedPassword = null;
                        try {
-                               currentEncryptedPassword = 
userMgr.encrypt(userLoginId, currentPassword);
-                               if 
(currentEncryptedPassword.equals(dbPassword)) {
-                                       validatePassword(newPassword);
-                                       
userMgr.updatePasswordInSHA256(userLoginId, newPassword, true);
-                                       logger.info("User '" + userLoginId + "' 
Password updated sucessfully.");
-                               }
-                               else if 
(!currentEncryptedPassword.equals(dbPassword) && defaultPwdChangeRequest) {
-                                       logger.info("current encryped password 
is not equal to dbpassword , trying with md5 now");
-                                       md5EncryptedPassword = 
userMgr.encryptWithOlderAlgo(userLoginId, currentPassword);
-                                       if 
(md5EncryptedPassword.equals(dbPassword)) {
+                               if (config.isFipsEnabled()) {
+                                       if (defaultPwdChangeRequest) {
+                                               md5EncryptedPassword = 
userMgr.encryptWithOlderAlgo(userLoginId, currentPassword);
+                                               if 
(md5EncryptedPassword.equals(dbPassword)) {
+                                                       
validatePassword(newPassword);
+                                                       
userMgr.updatePasswordInSHA256(userLoginId, newPassword, true);
+                                                       logger.info("User '" + 
userLoginId + "' Password updated sucessfully.");
+                                               } else {
+                                                       System.out.println(
+                                                                       
"Skipping default password change request as provided password doesn't match 
with existing password.");
+                                                       logger.error(
+                                                                       
"Skipping default password change request as provided password doesn't match 
with existing password.");
+                                                       System.exit(2);
+                                               }
+                                       } else if 
(userMgr.isPasswordValid(userLoginId, dbPassword, currentPassword)) {
                                                validatePassword(newPassword);
                                                
userMgr.updatePasswordInSHA256(userLoginId, newPassword, true);
                                                logger.info("User '" + 
userLoginId + "' Password updated sucessfully.");
-                                       } else {
-                                               System.out.println(
-                                                               "Skipping 
default password change request as provided password doesn't match with 
existing password.");
-                                               logger.error(
-                                                               "Skipping 
default password change request as provided password doesn't match with 
existing password.");
-                                               System.exit(2);
                                        }
                                } else {
-                                       System.out.println("Invalid user 
password");
-                                       logger.error("Invalid user password");
-                                       System.exit(1);
+                                       currentEncryptedPassword = 
userMgr.encrypt(userLoginId, currentPassword);
+                                       if 
(currentEncryptedPassword.equals(dbPassword)) {
+                                               validatePassword(newPassword);
+                                               
userMgr.updatePasswordInSHA256(userLoginId, newPassword, true);
+                                               logger.info("User '" + 
userLoginId + "' Password updated sucessfully.");
+                                       } else if 
(!currentEncryptedPassword.equals(dbPassword) && defaultPwdChangeRequest) {
+                                               logger.info("current encryped 
password is not equal to dbpassword , trying with md5 now");
+                                               md5EncryptedPassword = 
userMgr.encryptWithOlderAlgo(userLoginId, currentPassword);
+                                               if 
(md5EncryptedPassword.equals(dbPassword)) {
+                                                       
validatePassword(newPassword);
+                                                       
userMgr.updatePasswordInSHA256(userLoginId, newPassword, true);
+                                                       logger.info("User '" + 
userLoginId + "' Password updated sucessfully.");
+                                               } else {
+                                                       System.out.println(
+                                                                       
"Skipping default password change request as provided password doesn't match 
with existing password.");
+                                                       logger.error(
+                                                                       
"Skipping default password change request as provided password doesn't match 
with existing password.");
+                                                       System.exit(2);
+                                               }
+                                       } else {
+                                               System.out.println("Invalid 
user password");
+                                               logger.error("Invalid user 
password");
+                                               System.exit(1);
+                                       }
                                }
                        } catch (Exception e) {
                                logger.error("Update Admin Password failure. 
Detail:  \n", e);
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/UserREST.java 
b/security-admin/src/main/java/org/apache/ranger/rest/UserREST.java
index cf764a0..ffdf101 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/UserREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/UserREST.java
@@ -310,7 +310,6 @@ public class UserREST {
                        throw 
restErrorUtil.createRESTException("serverMsg.userRestUser",MessageEnums.DATA_NOT_FOUND,
 null, null,"");
                }
 
-               logger.info("changePassword:" + changePassword.getLoginId());
                XXPortalUser gjUser = 
daoManager.getXXPortalUser().findByLoginId(changePassword.getLoginId());
                if (gjUser == null) {
                        logger.warn("SECURITY:changePassword(): Invalid loginId 
provided: loginId="+ changePassword.getLoginId());
diff --git 
a/security-admin/src/main/java/org/apache/ranger/security/handler/RangerAuthenticationProvider.java
 
b/security-admin/src/main/java/org/apache/ranger/security/handler/RangerAuthenticationProvider.java
index a8b8c58..80c1a91 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/security/handler/RangerAuthenticationProvider.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/security/handler/RangerAuthenticationProvider.java
@@ -31,8 +31,10 @@ import javax.security.auth.login.Configuration;
 
 import org.apache.log4j.Logger;
 import org.apache.ranger.authentication.unix.jaas.RoleUserAuthorityGranter;
+import org.apache.ranger.authorization.hadoop.config.RangerAdminConfig;
 import org.apache.ranger.authorization.utils.StringUtil;
 import org.apache.ranger.common.PropertiesUtil;
+import org.apache.ranger.util.Pbkdf2PasswordEncoderCust;
 import 
org.springframework.ldap.core.support.DefaultTlsDirContextAuthenticationStrategy;
 import org.springframework.ldap.core.support.LdapContextSource;
 import org.springframework.security.authentication.AuthenticationProvider;
@@ -79,8 +81,10 @@ public class RangerAuthenticationProvider implements 
AuthenticationProvider {
        private LdapAuthenticator authenticator;
 
        private boolean ssoEnabled = false;
+       private final boolean isFipsEnabled;
 
        public RangerAuthenticationProvider() {
+               this.isFipsEnabled = 
RangerAdminConfig.getInstance().isFipsEnabled();
 
        }
 
@@ -135,6 +139,15 @@ public class RangerAuthenticationProvider implements 
AuthenticationProvider {
                                        return authentication;
                                }
                        }
+                       if (this.isFipsEnabled) {
+                               try {
+                                       authentication = 
getJDBCAuthentication(authentication,"");
+                               } catch (Exception e) {
+                                       logger.error("JDBC Authentication 
failure: ", e);
+                                       throw e;
+                               }
+                               return authentication;
+                       }
                        String encoder="SHA256";
                        try {
                                authentication = 
getJDBCAuthentication(authentication,encoder);
@@ -573,19 +586,26 @@ public class RangerAuthenticationProvider implements 
AuthenticationProvider {
 
        private Authentication getJDBCAuthentication(Authentication 
authentication,String encoder) throws AuthenticationException{
                try {
-
-                       ReflectionSaltSource saltSource = new 
ReflectionSaltSource();
-                       saltSource.setUserPropertyToUse("username");
-
                        DaoAuthenticationProvider authenticator = new 
DaoAuthenticationProvider();
                        authenticator.setUserDetailsService(userDetailsService);
-                       if (encoder != null && 
"SHA256".equalsIgnoreCase(encoder)) {
-                               authenticator.setPasswordEncoder(new 
ShaPasswordEncoder(256));
-                       } else if(encoder != null && 
"MD5".equalsIgnoreCase(encoder)) {
-                               authenticator.setPasswordEncoder(new 
Md5PasswordEncoder());
+                       if (this.isFipsEnabled) {
+                               if (authentication.getCredentials() != null && 
!authentication.isAuthenticated()) {
+                                       Pbkdf2PasswordEncoderCust 
passwordEncoder = new Pbkdf2PasswordEncoderCust(authentication.getName());
+                                       
passwordEncoder.setEncodeHashAsBase64(true);
+                                       
authenticator.setPasswordEncoder(passwordEncoder);
+                               }
+                       } else {
+                               ReflectionSaltSource saltSource = new 
ReflectionSaltSource();
+                               saltSource.setUserPropertyToUse("username");
+                               if (encoder != null && 
"SHA256".equalsIgnoreCase(encoder)) {
+                                       authenticator.setPasswordEncoder(new 
ShaPasswordEncoder(256));
+                                       authenticator.setSaltSource(saltSource);
+                               } else if (encoder != null && 
"MD5".equalsIgnoreCase(encoder)) {
+                                       authenticator.setPasswordEncoder(new 
Md5PasswordEncoder());
+                                       authenticator.setSaltSource(saltSource);
+                               }
                        }
 
-                       authenticator.setSaltSource(saltSource);
                        String userName ="";
                        String userPassword = "";
                        if (authentication!=null) {
@@ -616,6 +636,8 @@ public class RangerAuthenticationProvider implements 
AuthenticationProvider {
                        throw e;
                }catch (Exception e) {
                        throw e;
+               } catch (Throwable t) {
+                       throw new BadCredentialsException("Bad credentials", t);
                }
                return authentication;
        }
diff --git 
a/security-admin/src/main/java/org/apache/ranger/util/Pbkdf2PasswordEncoderCust.java
 
b/security-admin/src/main/java/org/apache/ranger/util/Pbkdf2PasswordEncoderCust.java
new file mode 100644
index 0000000..3a85cf0
--- /dev/null
+++ 
b/security-admin/src/main/java/org/apache/ranger/util/Pbkdf2PasswordEncoderCust.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.ranger.util;
+
+import org.springframework.security.crypto.codec.Base64;
+import org.springframework.security.crypto.codec.Hex;
+import org.springframework.security.crypto.codec.Utf8;
+import org.springframework.security.crypto.keygen.BytesKeyGenerator;
+import org.springframework.security.crypto.keygen.KeyGenerators;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.crypto.password.Pbkdf2PasswordEncoder;
+import org.springframework.security.crypto.util.EncodingUtils;
+
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+import java.security.GeneralSecurityException;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+
+public class Pbkdf2PasswordEncoderCust implements PasswordEncoder {
+    private static final int DEFAULT_HASH_WIDTH = 256;
+    private static final int DEFAULT_ITERATIONS = 185000;
+    private final BytesKeyGenerator saltGenerator;
+    private final byte[] secret;
+    private final int hashWidth;
+    private final int iterations;
+    private String algorithm;
+    private boolean encodeHashAsBase64;
+
+    public Pbkdf2PasswordEncoderCust(CharSequence secret) {
+        this(secret, DEFAULT_ITERATIONS, DEFAULT_HASH_WIDTH);
+    }
+
+    public Pbkdf2PasswordEncoderCust(CharSequence secret, int iterations, int 
hashWidth) {
+        this.saltGenerator = KeyGenerators.secureRandom(16);
+        this.algorithm = 
Pbkdf2PasswordEncoder.SecretKeyFactoryAlgorithm.PBKDF2WithHmacSHA512.name();
+        this.secret = Utf8.encode(secret);
+        this.iterations = iterations;
+        this.hashWidth = hashWidth;
+    }
+
+    public void setAlgorithm(Pbkdf2PasswordEncoder.SecretKeyFactoryAlgorithm 
secretKeyFactoryAlgorithm) {
+        if (secretKeyFactoryAlgorithm == null) {
+            throw new IllegalArgumentException("secretKeyFactoryAlgorithm 
cannot be null");
+        } else {
+            String algorithmName = secretKeyFactoryAlgorithm.name();
+
+            try {
+                SecretKeyFactory.getInstance(algorithmName);
+            } catch (NoSuchAlgorithmException var4) {
+                throw new IllegalArgumentException("Invalid algorithm '" + 
algorithmName + "'.", var4);
+            }
+
+            this.algorithm = algorithmName;
+        }
+    }
+
+    @Override
+    public String encode(CharSequence rawPassword) {
+        byte[] salt = this.saltGenerator.generateKey();
+        byte[] encoded = this.encode(rawPassword, salt);
+        return this.encode(encoded);
+    }
+
+    public void setEncodeHashAsBase64(boolean encodeHashAsBase64) {
+        this.encodeHashAsBase64 = encodeHashAsBase64;
+    }
+
+    private String encode(byte[] bytes) {
+        return this.encodeHashAsBase64 ? Utf8.decode(Base64.encode(bytes)) : 
String.valueOf(Hex.encode(bytes));
+    }
+
+    @Override
+    public boolean matches(CharSequence rawPassword, String encodedPassword) {
+        byte[] digested = this.decode(encodedPassword);
+        byte[] salt = EncodingUtils.subArray(digested, 0, 
this.saltGenerator.getKeyLength());
+        return matches(digested, this.encode(rawPassword, salt));
+    }
+    
+    private static boolean matches(byte[] expected, byte[] actual) {
+       return Arrays.equals(expected, actual);
+    }
+
+
+    private byte[] decode(String encodedBytes) {
+        return this.encodeHashAsBase64 ? 
Base64.decode(Utf8.encode(encodedBytes)) : Hex.decode(encodedBytes);
+    }
+
+    private byte[] encode(CharSequence rawPassword, byte[] salt) {
+        try {
+            PBEKeySpec spec = new 
PBEKeySpec(rawPassword.toString().toCharArray(), EncodingUtils.concatenate(new 
byte[][]{salt, this.secret}), this.iterations, this.hashWidth);
+            SecretKeyFactory skf = 
SecretKeyFactory.getInstance(this.algorithm);
+            return EncodingUtils.concatenate(new byte[][]{salt, 
skf.generateSecret(spec).getEncoded()});
+        } catch (GeneralSecurityException var5) {
+            throw new IllegalStateException("Could not create hash", var5);
+        }
+    }
+}
diff --git 
a/tagsync/src/main/java/org/apache/ranger/tagsync/process/TagSyncConfig.java 
b/tagsync/src/main/java/org/apache/ranger/tagsync/process/TagSyncConfig.java
index 95c3482..9245fdf 100644
--- a/tagsync/src/main/java/org/apache/ranger/tagsync/process/TagSyncConfig.java
+++ b/tagsync/src/main/java/org/apache/ranger/tagsync/process/TagSyncConfig.java
@@ -81,6 +81,7 @@ public class TagSyncConfig extends Configuration {
 
        private static final String 
TAGSYNC_FILESOURCE_MOD_TIME_CHECK_INTERVAL_PROP = 
"ranger.tagsync.source.file.check.interval.millis";
 
+       private static final String TAGSYNC_KEYSTORE_TYPE_PROP = 
"ranger.keystore.file.type";
        private static final String TAGSYNC_TAGADMIN_KEYSTORE_PROP = 
"ranger.tagsync.keystore.filename";
        private static final String TAGSYNC_ATLASREST_KEYSTORE_PROP = 
"ranger.tagsync.source.atlasrest.keystore.filename";
 
@@ -216,9 +217,8 @@ public class TagSyncConfig extends Configuration {
                return sb.toString() + super.toString();
        }
 
-       static public boolean isTagSyncEnabled(Properties prop) {
-               String val = prop.getProperty(TAGSYNC_ENABLED_PROP);
-               return val == null || Boolean.valueOf(val.trim());
+       static public String getTagsyncKeyStoreType(Properties prop) {
+               return prop.getProperty(TAGSYNC_KEYSTORE_TYPE_PROP);
        }
 
        static public boolean isTagSyncRangerCookieEnabled(Properties prop) {
@@ -277,6 +277,11 @@ public class TagSyncConfig extends Configuration {
                return prop.getProperty(TAGSYNC_TAGADMIN_REST_URL_PROP);
        }
 
+       static public boolean isTagSyncEnabled(Properties prop) {
+               String val = prop.getProperty(TAGSYNC_ENABLED_PROP);
+               return val == null || Boolean.valueOf(val.trim());
+       }
+
        static public String getTagAdminPassword(Properties prop) {
                //update credential from keystore
                String password = null;
@@ -291,7 +296,7 @@ public class TagSyncConfig extends Configuration {
                        if (path != null) {
                                if (!path.trim().isEmpty()) {
                                        try {
-                                               password = 
CredentialReader.getDecryptedString(path.trim(), 
TAGSYNC_DEST_RANGER_PASSWORD_ALIAS);
+                                               password = 
CredentialReader.getDecryptedString(path.trim(), 
TAGSYNC_DEST_RANGER_PASSWORD_ALIAS, getTagsyncKeyStoreType(prop));
                                        } catch (Exception ex) {
                                                password = null;
                                        }
@@ -341,7 +346,7 @@ public class TagSyncConfig extends Configuration {
                        if (path != null) {
                                if (!path.trim().isEmpty()) {
                                        try {
-                                               password = 
CredentialReader.getDecryptedString(path.trim(), 
TAGSYNC_SOURCE_ATLASREST_PASSWORD_ALIAS);
+                                               password = 
CredentialReader.getDecryptedString(path.trim(), 
TAGSYNC_SOURCE_ATLASREST_PASSWORD_ALIAS, getTagsyncKeyStoreType(prop));
                                        } catch (Exception ex) {
                                                password = null;
                                        }
diff --git 
a/ugsync/src/main/java/org/apache/ranger/unixusersync/config/UserGroupSyncConfig.java
 
b/ugsync/src/main/java/org/apache/ranger/unixusersync/config/UserGroupSyncConfig.java
index 5ef78cf..5d5ad58 100644
--- 
a/ugsync/src/main/java/org/apache/ranger/unixusersync/config/UserGroupSyncConfig.java
+++ 
b/ugsync/src/main/java/org/apache/ranger/unixusersync/config/UserGroupSyncConfig.java
@@ -23,6 +23,7 @@ import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.security.KeyStore;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -32,6 +33,7 @@ import java.util.StringTokenizer;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.conf.Configuration;
+//import org.apache.hadoop.security.alias.BouncyCastleFipsKeyStoreProvider;
 import org.apache.ranger.credentialapi.CredentialReader;
 import org.apache.ranger.plugin.util.RangerCommonConstants;
 import org.apache.ranger.plugin.util.XMLUtils;
@@ -76,6 +78,10 @@ public class UserGroupSyncConfig  {
        public static final String UGSYNC_SOURCE_FILE_DELIMITER = 
"ranger.usersync.filesource.text.delimiter";
        public static final String UGSYNC_SOURCE_FILE_DELIMITERER = 
"ranger.usersync.filesource.text.delimiterer";
 
+       private static final String SSL_KEYSTORE_FILE_TYPE_PARAM = 
"ranger.keystore.file.type";
+
+       private static final String SSL_TRUSTSTORE_FILE_TYPE_PARAM = 
"ranger.truststore.file.type";
+
        private static final String SSL_KEYSTORE_PATH_PARAM = 
"ranger.usersync.keystore.file";
 
        private static final String SSL_KEYSTORE_PATH_PASSWORD_PARAM = 
"ranger.usersync.keystore.password";
@@ -389,6 +395,13 @@ public class UserGroupSyncConfig  {
                return prop.getProperty(UGSYNC_MAX_RECORDS_PER_API_CALL_PROP);
        }
 
+       public String getSSLKeyStoreType() {
+               return  prop.getProperty(SSL_KEYSTORE_FILE_TYPE_PARAM, 
KeyStore.getDefaultType());
+       }
+
+       public String getSSLTrustStoreType() {
+               return  prop.getProperty(SSL_TRUSTSTORE_FILE_TYPE_PARAM, 
KeyStore.getDefaultType());
+       }
 
        public String getSSLKeyStorePath() {
                return  prop.getProperty(SSL_KEYSTORE_PATH_PARAM);
@@ -404,7 +417,11 @@ public class UserGroupSyncConfig  {
                        String alias=SSL_KEYSTORE_PATH_PASSWORD_ALIAS;
                        if(path!=null && alias!=null){
                                if(!path.trim().isEmpty() && 
!alias.trim().isEmpty()){
-                                       String 
password=CredentialReader.getDecryptedString(path.trim(),alias.trim());
+                                       if 
("bcfks".equalsIgnoreCase(getSSLKeyStoreType())) {
+                                               String 
crendentialProviderPrefixBcfks= "bcfks" + "://file";
+                                               path = 
crendentialProviderPrefixBcfks + path;
+                                       }
+                                       String 
password=CredentialReader.getDecryptedString(path.trim(),alias.trim(), 
getSSLKeyStoreType());
                                        if(password!=null&& 
!password.trim().isEmpty() && !"none".equalsIgnoreCase(password.trim()) && 
!"_".equalsIgnoreCase(password.trim())){
                                                
prop.setProperty(SSL_KEYSTORE_PATH_PASSWORD_PARAM,password);
                                        }
@@ -428,7 +445,11 @@ public class UserGroupSyncConfig  {
                        String alias=SSL_TRUSTSTORE_PATH_PASSWORD_ALIAS;
                        if(path!=null && alias!=null){
                                if(!path.trim().isEmpty() && 
!alias.trim().isEmpty()){
-                                       String 
password=CredentialReader.getDecryptedString(path.trim(),alias.trim());
+                                       if 
("bcfks".equalsIgnoreCase(getSSLKeyStoreType())) {
+                                               String 
crendentialProviderPrefixBcfks= "bcfks" + "://file";
+                                               path = 
crendentialProviderPrefixBcfks + path;
+                                       }
+                                       String 
password=CredentialReader.getDecryptedString(path.trim(),alias.trim(), 
getSSLKeyStoreType());
                                        if(password!=null&& 
!password.trim().isEmpty() && !"none".equalsIgnoreCase(password.trim()) && 
!"_".equalsIgnoreCase(password.trim())){
                                                
prop.setProperty(SSL_TRUSTSTORE_PATH_PASSWORD_PARAM,password);
                                        }
@@ -562,7 +583,11 @@ public class UserGroupSyncConfig  {
                        String alias=LGSYNC_LDAP_BIND_ALIAS;
                        if(path!=null && alias!=null){
                                if(!path.trim().isEmpty() && 
!alias.trim().isEmpty()){
-                                       String 
password=CredentialReader.getDecryptedString(path.trim(),alias.trim());
+                                       if 
("bcfks".equalsIgnoreCase(getSSLKeyStoreType())) {
+                                               String 
crendentialProviderPrefixBcfks= "bcfks" + "://file";
+                                               path = 
crendentialProviderPrefixBcfks + path;
+                                       }
+                                       String 
password=CredentialReader.getDecryptedString(path.trim(),alias.trim(), 
getSSLKeyStoreType());
                                        if(password!=null&& 
!password.trim().isEmpty() && !password.trim().equalsIgnoreCase("none")){
                                                
prop.setProperty(LGSYNC_LDAP_BIND_PASSWORD,password);
                                        }
@@ -890,8 +915,12 @@ public class UserGroupSyncConfig  {
                        String 
alias=prop.getProperty(SYNC_POLICY_MGR_ALIAS,"policymgr.user.password");
                        if(path!=null && alias!=null){
                                if(!path.trim().isEmpty() && 
!alias.trim().isEmpty()){
+                                       if 
("bcfks".equalsIgnoreCase(getSSLKeyStoreType())) {
+                                               String 
crendentialProviderPrefixBcfks= "bcfks" + "://file";
+                                               path = 
crendentialProviderPrefixBcfks + path;
+                                       }
                                        try{
-                                               
password=CredentialReader.getDecryptedString(path.trim(),alias.trim());
+                                               
password=CredentialReader.getDecryptedString(path.trim(),alias.trim(), 
getSSLKeyStoreType());
                                        }catch(Exception ex){
                                                password=null;
                                        }
diff --git 
a/ugsync/src/main/java/org/apache/ranger/unixusersync/process/PolicyMgrUserGroupBuilder.java
 
b/ugsync/src/main/java/org/apache/ranger/unixusersync/process/PolicyMgrUserGroupBuilder.java
index f911f22..ee9a254 100644
--- 
a/ugsync/src/main/java/org/apache/ranger/unixusersync/process/PolicyMgrUserGroupBuilder.java
+++ 
b/ugsync/src/main/java/org/apache/ranger/unixusersync/process/PolicyMgrUserGroupBuilder.java
@@ -22,7 +22,6 @@ package org.apache.ranger.unixusersync.process;
 import java.io.IOException;
 import java.lang.reflect.Type;
 import java.net.UnknownHostException;
-import java.security.KeyStore;
 import java.security.PrivilegedAction;
 import java.util.Map;
 import java.util.Set;
@@ -186,8 +185,8 @@ private static final Logger LOG = 
Logger.getLogger(PolicyMgrUserGroupBuilder.cla
                String trustStoreFile = config.getSSLTrustStorePath();
                String keyStoreFilepwd = config.getSSLKeyStorePathPassword();
                String trustStoreFilepwd = 
config.getSSLTrustStorePathPassword();
-               String keyStoreType = KeyStore.getDefaultType();
-               String trustStoreType = KeyStore.getDefaultType();
+               String keyStoreType = config.getSSLKeyStoreType();
+               String trustStoreType = config.getSSLTrustStoreType();
                authenticationType = 
config.getProperty(AUTHENTICATION_TYPE,"simple");
                try {
                        principal = 
SecureClientLogin.getPrincipal(config.getProperty(PRINCIPAL,""), 
LOCAL_HOSTNAME);
diff --git 
a/unixauthservice/src/main/java/org/apache/ranger/authentication/UnixAuthenticationService.java
 
b/unixauthservice/src/main/java/org/apache/ranger/authentication/UnixAuthenticationService.java
index 3f7886b..92eb229 100644
--- 
a/unixauthservice/src/main/java/org/apache/ranger/authentication/UnixAuthenticationService.java
+++ 
b/unixauthservice/src/main/java/org/apache/ranger/authentication/UnixAuthenticationService.java
@@ -64,6 +64,9 @@ public class UnixAuthenticationService {
        private static final String SSL_KEYSTORE_PATH_PARAM = 
"ranger.usersync.keystore.file";
        private static final String SSL_TRUSTSTORE_PATH_PARAM = 
"ranger.usersync.truststore.file";
 
+       private static final String SSL_KEYSTORE_FILE_TYPE_PARAM = 
"ranger.keystore.file.type";
+       private static final String SSL_TRUSTSTORE_FILE_TYPE_PARAM = 
"ranger.truststore.file.type";
+
        private static final String SSL_KEYSTORE_PATH_PASSWORD_ALIAS = 
"usersync.ssl.key.password";
        private static final String SSL_TRUSTSTORE_PATH_PASSWORD_ALIAS = 
"usersync.ssl.truststore.password";
 
@@ -75,10 +78,12 @@ public class UnixAuthenticationService {
        private static final String CREDSTORE_FILENAME_PARAM = 
"ranger.usersync.credstore.filename";
        
        private String keyStorePath;
+       private String keyStoreType;
        private List<String> enabledProtocolsList;
        private String keyStorePathPassword;
        private String trustStorePath;
        private String trustStorePathPassword;
+       private String trustStoreType;
        private List<String>  adminUserList = new ArrayList<String>();
        private String adminRoleNames;
        
@@ -179,6 +184,9 @@ public class UnixAuthenticationService {
                String credStoreFileName = 
prop.getProperty(CREDSTORE_FILENAME_PARAM);
                
                keyStorePath = prop.getProperty(SSL_KEYSTORE_PATH_PARAM);
+
+               keyStoreType = prop.getProperty(SSL_KEYSTORE_FILE_TYPE_PARAM, 
KeyStore.getDefaultType());
+               trustStoreType = 
prop.getProperty(SSL_TRUSTSTORE_FILE_TYPE_PARAM, KeyStore.getDefaultType());
                
                if (credStoreFileName == null) {
                        throw new RuntimeException("Credential file is not 
defined. param = [" + CREDSTORE_FILENAME_PARAM + "]");
@@ -194,8 +202,12 @@ public class UnixAuthenticationService {
                        throw new RuntimeException("Credential file [" + 
credStoreFileName + "]: can not be read." );
                }
                
-               keyStorePathPassword = 
CredentialReader.getDecryptedString(credStoreFileName, 
SSL_KEYSTORE_PATH_PASSWORD_ALIAS);
-               trustStorePathPassword = 
CredentialReader.getDecryptedString(credStoreFileName,SSL_TRUSTSTORE_PATH_PASSWORD_ALIAS);
+               if ("bcfks".equalsIgnoreCase(keyStoreType)) {
+                       String crendentialProviderPrefixBcfks= "bcfks" + 
"://file";
+                       credStoreFileName = crendentialProviderPrefixBcfks + 
credStoreFileName;
+               }
+               keyStorePathPassword = 
CredentialReader.getDecryptedString(credStoreFileName, 
SSL_KEYSTORE_PATH_PASSWORD_ALIAS, keyStoreType);
+               trustStorePathPassword = 
CredentialReader.getDecryptedString(credStoreFileName,SSL_TRUSTSTORE_PATH_PASSWORD_ALIAS,
 trustStoreType);
                
                trustStorePath  = prop.getProperty(SSL_TRUSTSTORE_PATH_PARAM);
                portNum = 
Integer.parseInt(prop.getProperty(REMOTE_LOGIN_AUTH_SERVICE_PORT_PARAM));
@@ -244,8 +256,8 @@ public class UnixAuthenticationService {
                KeyManager[] km = null;
 
                if (keyStorePath != null && ! keyStorePath.isEmpty()) {
-                       KeyStore ks = 
KeyStore.getInstance(KeyStore.getDefaultType());
-                       
+                       KeyStore ks = KeyStore.getInstance(keyStoreType);
+               
                        InputStream in = null;
                        
                        in = getFileInputStream(keyStorePath);
@@ -273,7 +285,7 @@ public class UnixAuthenticationService {
                KeyStore trustStoreKeyStore = null;
                
                if (trustStorePath != null && ! trustStorePath.isEmpty()) {
-                       trustStoreKeyStore = 
KeyStore.getInstance(KeyStore.getDefaultType());
+                       trustStoreKeyStore = 
KeyStore.getInstance(trustStoreType);
                        
                        InputStream in = null;
                        

Reply via email to