bx-password-encrypt — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited bx-password-encrypt (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
install-bx-module bx-password-encrypt
# CommandBox
box install bx-password-encrypt| Algorithm | BIF (Hash) | BIF (Verify) | When to Use |
|---|---|---|---|
| BCrypt | BCryptHash() | BCryptVerify() | Default choice — battle-tested, widely supported |
| Argon2 | ArgonHash() | ArgonVerify() | Best for new apps — PHC winner, memory-hard |
| SCrypt | SCryptHash() | SCryptVerify() | Memory-hard, good GPU resistance |
| PBKDF2 | PBKDF2Hash() | PBKDF2Verify() | NIST-approved, compliance environments |
// Hash a password (default cost factor: 10)
hash = BCryptHash( "myPassword123" )
// Hash with custom cost factor (higher = slower = more secure; typical: 10-12)
hash = BCryptHash( "myPassword123", 12 )
// Verify
isValid = BCryptVerify( "myPassword123", hash ) // true
isValid = BCryptVerify( "wrongPassword", hash ) // false
// Aliases
hash = GenerateBCryptHash( "myPassword123" )
isValid = VerifyBCryptHash( "myPassword123", hash )// Hash with defaults
hash = ArgonHash( "myPassword123" )
// Hash with custom parameters
hash = ArgonHash(
"myPassword123",
"", // salt (auto-generated if empty)
10, // iterations
65536, // memory in KB
4 // parallelism threads
)
// Verify
isValid = ArgonVerify( "myPassword123", hash )
// Aliases
hash = GenerateArgon2Hash( "myPassword123" )
isValid = Argon2CheckHash( "myPassword123", hash )// Hash with defaults
hash = SCryptHash( "myPassword123" )
// Hash with custom parameters
hash = SCryptHash(
"myPassword123",
16384, // cpuCost
8, // memoryCost
1 // parallelization
)
// Verify
isValid = SCryptVerify( "myPassword123", hash )
// Aliases
hash = GenerateSCryptHash( "myPassword123" )
isValid = VerifySCryptHash( "myPassword123", hash )// Hash with PBKDF2
hash = PBKDF2Hash( "myPassword123" )
// With custom parameters
hash = PBKDF2Hash(
"myPassword123",
"", // salt (auto-generated if empty)
310000, // iterations (NIST recommends 310,000+ for PBKDF2-SHA256)
"SHA-256", // algorithm
32 // key length in bytes
)
// Verify
isValid = PBKDF2Verify( "myPassword123", hash )class UserService {
function register( username, plainPassword ) {
// Always hash before storing
var hashedPassword = BCryptHash( arguments.plainPassword )
queryExecute(
"INSERT INTO users (username, password_hash) VALUES (:u, :p)",
{ u: arguments.username, p: hashedPassword }
)
}
function login( username, plainPassword ) {
var user = queryExecute(
"SELECT id, password_hash FROM users WHERE username = :u",
{ u: arguments.username },
{ returntype: "array" }
)
if ( !arrayLen( user ) ) return false // User not found
return BCryptVerify( arguments.plainPassword, user[1].password_hash )
}
function changePassword( userId, currentPassword, newPassword ) {
var user = queryExecute(
"SELECT password_hash FROM users WHERE id = :id",
{ id: userId },
{ returntype: "array" }
)
if ( !BCryptVerify( currentPassword, user[1].password_hash ) ) {
throw( type: "Auth.InvalidPassword", message: "Current password is incorrect" )
}
var newHash = BCryptHash( newPassword, 12 )
queryExecute(
"UPDATE users SET password_hash = :h WHERE id = :id",
{ h: newHash, id: userId }
)
}
}ArgonHash) — current PHC winnerBCryptHash) — well-understood, compatiblePBKDF2Hash)== — always use the verify BIFs (timing-safe comparison)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.