Я сохраняю пароль argon2 в базе данных как bytea
и base64.
Проверка работает с base64, но буфер из bytea
отличается, он не дополняется пустыми байтами.
Я понятия не имею, что вызывает это.
passwordDigest
тип - varchar и содержит хэш base64 passwordDigest2
тип - bytea
Мой код:
const pwd = securePassword({
memlimit: config.security.argon_mem,
opslimit: config.security.argon_ops
})
// Password as binary
const passwordDigest_byte = await pwd.hash(passwordBuffer)
// Password ar base64
const passwordDigest = passwordDigest_byte.toString("base64")
const { rows } = await client.query(
"INSERT INTO master.users (user_id, username, email, password_digest, password_digest2) VALUES ($1, $2, $3, $4, $5) RETURNING user_id",
[userId, username, email, passwordDigest, passwordDigest_byte]
)
/// ...
console.log("In DB - raw")
buflog(Buffer.alloc(128, user.rows[0].password_digest2))
console.log("In DB from b64")
buflog(Buffer.alloc(128, user.rows[0].password_digest, "base64"))
function buflog(buf) {
console.log(
buf
.toString("hex")
.match(/../g)
.join(" ")
)
}
Вывод:
In DB - raw
24 61 72 67 6f 6e 32 69 64 24 76 3d 31 39 24 6d 3d 36 35 35 33 36 2c 74 3d 34 2c 70 3d 31 24 54 66 49 76 6d 4f 42 33 47 56 41 4b 4b 63 46 5a 45 79 4e 4e 48 51 24 53 71 4e 54 70 44 7a 6a 76 42 4b 6a 35 69 41 67 2b 4f 32 33 7a 38 50 73 4a 70 54 62 59 73 6d 45 43 31 38 76 52 38 53 52 41 47 51 24 61 72 67 6f 6e 32 69 64 24 76 3d 31 39 24 6d 3d 36 35 35 33 36 2c 74 3d 34 2c 70 3d 31 24
In DB from b64
24 61 72 67 6f 6e 32 69 64 24 76 3d 31 39 24 6d 3d 36 35 35 33 36 2c 74 3d 34 2c 70 3d 31 24 54 66 49 76 6d 4f 42 33 47 56 41 4b 4b 63 46 5a 45 79 4e 4e 48 51 24 53 71 4e 54 70 44 7a 6a 76 42 4b 6a 35 69 41 67 2b 4f 32 33 7a 38 50 73 4a 70 54 62 59 73 6d 45 43 31 38 76 52 38 53 52 41 47 51 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Сбой проверки пароля с двоичными данными, но успешен при использовании с версией base64.
Согласно моему argon2, длина буфера должна быть 128байт.Длина bytea
составляет 97 байтов.Заполнение удаляется при хранении внутри Postgresql.
Я не совсем уверен, является ли это проблемой postgresql или проблемой nodejs, но я подозреваю, что это проблема Buffer.alloc
, вызывающая проблему.