PBKDF2WithHmacSHA512 SecretKeyFactory недоступна ошибка - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь использовать API безопасности в Java EE 8 , хэшируя пароль.Я создал @ DatabaseIdentityStoreDefinition

@BasicAuthenticationMechanismDefinition(
    realmName = "Book Realm"
)
@DatabaseIdentityStoreDefinition(
    dataSourceLookup = "jdbc/userAuth",
    callerQuery = "select password from users where USERNAME = ?",
    groupsQuery = "select g.GROUP_NAME from USER_GROUPS ug, users u, GROUPS g where ug.USER_ID = u.user_id and g.GROUP_ID= ug.GROUP_ID and u.USERNAME=?"
    hashAlgorithm = Pbkdf2PasswordHash.class,
    hashAlgorithmParameters = {
            "Pbkdf2PasswordHash.Iterations=3072",
            "Pbkdf2PasswordHash.Algorithm=PBKDF2WithHmacSHA512",
            "Pbkdf2PasswordHash.SaltSizeBytes=64"
    }
)
@DeclareRoles({"user", "admin"})
@WebServlet("/securedServlet")
@ServletSecurity(
    @HttpConstraint(rolesAllowed = {"admin"}))
public class SecuredServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.getWriter().write("Congratulations, login successful.");
    }
}

при развертывании файла war на сервере приложений Glassfish 5 я получаю следующее исключение:

java.lang.IllegalStateException: java.security.NoSuchAlgorithmException: PBKDF2WithHmacSHA512 SecretKeyFactory not available

Это исключение приходитиз класса, который я создал для автоматического создания и вставки пользователя в базу данных.

Соответствующие части этого класса:

@Resource(mappedName = "jdbc/userAuth")
private DataSource dataSource;

@Inject
private Pbkdf2PasswordHash passwordHash;

public void init(@Observes @Initialized(ApplicationScoped.class) Object init) {
        Map<String, String> parameters = new HashMap<>();
        parameters.put("Pbkdf2PasswordHash.Iterations", "3072");
        parameters.put("Pbkdf2PasswordHash.Algorithm", "PBKDF2WithHmacSHA512");
        parameters.put("Pbkdf2PasswordHash.SaltSizeBytes", "64");
        passwordHash.initialize(parameters);
        executeUpdate(dataSource, "INSERT INTO USERS (USER_ID,USERNAME,FIRST_NAME,MIDDLE_NAME,LAST_NAME,PASSWORD) VALUES (1,'beaver','Beaver','The Dam','Lake','" + passwordHash.generate("beaverattack".toCharArray()) + "')");

В файле pom.xml у меня есть следующеезависимости:

<dependency>
  <groupId>javax</groupId>
  <artifactId>javaee-web-api</artifactId>
  <version>8.0</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>javax.security.enterprise</groupId>
  <artifactId>javax.security.enterprise-api</artifactId>
  <version>1.0</version>
  <scope>provided</scope>
</dependency>

Java-версия:

java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
...