<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Topics tagged with password]]></title><description><![CDATA[A list of topics that have been tagged with password]]></description><link>https://fusionauth.io/community/forum/tags/password</link><generator>RSS for Node</generator><lastBuildDate>Sun, 07 Jun 2026 20:00:36 GMT</lastBuildDate><atom:link href="https://fusionauth.io/community/forum/tags/password.rss" rel="self" type="application/rss+xml"/><pubDate>Invalid Date</pubDate><ttl>60</ttl><item><title><![CDATA[MFA with the password grant]]></title><description><![CDATA[<p dir="auto">Thanks for addressing this use case. Your proposal, however, runs counter to any standardization effort: Long live OAuth! 🙂</p>
<p dir="auto">A better approach would be to switch from a password grant to the use of authorization codes (instead of passwords) to obtain the access token. This is fully within the OAuth framework and does not introduce fusionauth-specific hacks into the solution.</p>
<p dir="auto">We have created as simple html page that redirects to the fusionauth authorize endpoint with grant_type=authorization_code. The browser handles MFA as usual. Upon redirecting to this page, the page can harvest the authorization code for the user to copy. From there proceed with into authorization code in place of a password.</p>
<p dir="auto">PS: Long live OAuth!</p>
]]></description><link>https://fusionauth.io/community/forum/topic/1348/mfa-with-the-password-grant</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/1348/mfa-with-the-password-grant</guid><dc:creator><![CDATA[admin b]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Password constraints below tenant level]]></title><description><![CDATA[<p dir="auto">Nope, at this time it is all configured at the tenant, via the UI or API.</p>
<p dir="auto">If you have specific needs, please file a github issue outlining your use case: <a href="https://github.com/fusionauth/fusionauth-issues/issues" rel="nofollow ugc">https://github.com/fusionauth/fusionauth-issues/issues</a></p>
]]></description><link>https://fusionauth.io/community/forum/topic/1255/password-constraints-below-tenant-level</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/1255/password-constraints-below-tenant-level</guid><dc:creator><![CDATA[dan]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Issue with bcrypt on import of users]]></title><description><![CDATA[<p dir="auto">You'll need to separate out the hash and the salt on the Import API.</p>
<p dir="auto">For example, the hash $2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy would be split out to the fields:</p>
<p dir="auto">factor: 10<br />
salt:  N9qo8uLOickgx2ZMRZoMye<br />
password: IjZAgcfl7p92ldGxad68LJZdL17lhWy</p>
<p dir="auto">The Import API does not parse this value and separate it out for you. You need to do so.</p>
<p dir="auto">Here is an example import script (in Ruby): <a href="https://github.com/FusionAuth/fusionauth-import-scripts/blob/master/auth0/import.rb#L47" rel="nofollow ugc">https://github.com/FusionAuth/fusionauth-import-scripts/blob/master/auth0/import.rb#L47</a></p>
]]></description><link>https://fusionauth.io/community/forum/topic/1048/issue-with-bcrypt-on-import-of-users</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/1048/issue-with-bcrypt-on-import-of-users</guid><dc:creator><![CDATA[dan]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[What password rule options does FusionAuth have?]]></title><description><![CDATA[<p dir="auto">A duplicate of <a href="https://fusionauth.io/community/forum/topic/438/password-complexity-rules">https://fusionauth.io/community/forum/topic/438/password-complexity-rules</a></p>
<p dir="auto">But the easiest way to see this is in the <a href="https://fusionauth.io/docs/v1/tech/apis/tenants/" rel="nofollow ugc">tenant API</a>, since that is where they are configured.</p>
<p dir="auto">At time of writing, here are the options.</p>
<p dir="auto">Screen Shot 2021-05-12 at 1.50.12 PM.png</p>
]]></description><link>https://fusionauth.io/community/forum/topic/1007/what-password-rule-options-does-fusionauth-have</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/1007/what-password-rule-options-does-fusionauth-have</guid><dc:creator><![CDATA[dan]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Password encryption scheme data?]]></title><description><![CDATA[<p dir="auto">This data is exposed in version 1.20.1.</p>
]]></description><link>https://fusionauth.io/community/forum/topic/477/password-encryption-scheme-data</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/477/password-encryption-scheme-data</guid><dc:creator><![CDATA[dan]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Updating a user&#x27;s password and salt]]></title><description><![CDATA[<p dir="auto">If you’re looking to update the password, you can use the Update User API, or the Change Password API.</p>
<p dir="auto">Neither of these APIs accept a hashed password and salt however, it accepts a plain text password that it will in turn salt, hash and then persist.</p>
<p dir="auto">Check out both these APIs here: <a href="https://fusionauth.io/docs/v1/tech/apis/users" rel="nofollow ugc">https://fusionauth.io/docs/v1/tech/apis/users</a></p>
]]></description><link>https://fusionauth.io/community/forum/topic/365/updating-a-user-s-password-and-salt</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/365/updating-a-user-s-password-and-salt</guid><dc:creator><![CDATA[dan]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[I&#x27;ve written a password encryption plugin I want to share. Where can I share it?]]></title><description><![CDATA[<p dir="auto">In case it helps anyone, a version of the <a href="https://github.com/dotnet/aspnetcore/blob/master/src/Identity/Extensions.Core/src/PasswordHasher.cs#L141" rel="nofollow ugc">ASP.NET Core Identity PasswordHasher HashPasswordV3</a></p>
package com.mycompany.fusionauth.plugins;

import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Base64;
import io.fusionauth.plugin.spi.security.PasswordEncryptor;

/**
* Example password hashing based on Asp.Net Core Identity PasswordHasher HashPasswordV3.
*/
public class ExampleDotNetPBDKF2HMACSHA256PasswordEncryptor implements PasswordEncryptor {

  @Override
  public int defaultFactor() {
    return 10_000;
  }

  @Override
  public String encrypt(String password, String salt, int factor) {
    if (factor &lt;= 0) {
      throw new IllegalArgumentException("Invalid factor value [" + factor + "]");
    }

    SecretKeyFactory keyFactory;
    try {
      keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
    } catch (NoSuchAlgorithmException e) {
      throw new IllegalStateException("No such algorithm [PBKDF2WithHmacSHA256]");
    }

	int keyLength = 32; // numBytesRequested
	byte[] saltBytes = Base64.getDecoder().decode(salt); // assumes Base64 encoded salt. saltSize: 16 bytes

    KeySpec keySpec = new PBEKeySpec(password.toCharArray(), saltBytes, factor, keyLength * 8);
    SecretKey secret;
    try {
      secret = keyFactory.generateSecret(keySpec); // subkey
    } catch (InvalidKeySpecException e) {
      throw new IllegalArgumentException("Could not generate secret key for algorithm [PBKDF2WithHmacSHA256]");
    }
	
	byte[] outputBytes = new byte[13 + saltBytes.length + secret.getEncoded().length];
	outputBytes[0] = 0x01; // format marker
	WriteNetworkByteOrder(outputBytes, 1, 1);
	WriteNetworkByteOrder(outputBytes, 5, factor);
	WriteNetworkByteOrder(outputBytes, 9, saltBytes.length);
	System.arraycopy(saltBytes, 0, outputBytes, 13, saltBytes.length);
	System.arraycopy(secret.getEncoded(), 0, outputBytes, 13 + saltBytes.length, secret.getEncoded().length);
	
	return new String(Base64.getEncoder().encode(outputBytes));
  }
  
  private static void WriteNetworkByteOrder(byte[] buffer, int offset, int value)
  {
	buffer[offset + 0] = (byte)(value &gt;&gt; 24);
	buffer[offset + 1] = (byte)(value &gt;&gt; 16);
	buffer[offset + 2] = (byte)(value &gt;&gt; 8);
	buffer[offset + 3] = (byte)(value &gt;&gt; 0);
  }
}

package com.mycompany.fusionauth.plugins;

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;

public class ExampleDotNetPBDKF2HMACSHA256PasswordEncryptorTest {
  @Test(dataProvider = "hashes")
  public void encrypt(String password, String salt, String hash) {
    ExampleDotNetPBDKF2HMACSHA256PasswordEncryptor encryptor = new ExampleDotNetPBDKF2HMACSHA256PasswordEncryptor();
    assertEquals(encryptor.encrypt(password, salt, 10_000), hash);
  }

  @DataProvider(name = "hashes")
  public Object[][] hashes() {
    return new Object[][]{
        {"MyExamplePassword", "CVsv6SwPJr7WDrVvAb+7aw==", "AQAAAAEAACcQAAAAEAlbL+ksDya+1g61bwG/u2ssOcnQU6Q2xo9tmijJv0zM2GsxeOl04NSpXRsAveBBag=="},
    };
  }
}

]]></description><link>https://fusionauth.io/community/forum/topic/126/i-ve-written-a-password-encryption-plugin-i-want-to-share-where-can-i-share-it</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/126/i-ve-written-a-password-encryption-plugin-i-want-to-share-where-can-i-share-it</guid><dc:creator><![CDATA[pclark]]></dc:creator><pubDate>Invalid Date</pubDate></item></channel></rss>