📜  erpnext 获取密码字段 (1)

📅  最后修改于: 2023-12-03 14:41:00.163000             🧑  作者: Mango

获取 ERPNext 中的密码字段

在 ERPNext 中,密码字段是被加密过的,直接获取数据库中的密码是无法使用的。所以,在获取密码字段之前,需要先了解密码字段的存储方式以及加密算法。

密码字段的存储方式

ERPNext 的密码字段是存储在 User doctype 中的。具体的,密码字段被存储在 "password" 字段中,加密盐被存储在 "salt" 字段中。在密码被加密之前,密码与盐会被连接起来形成一个较长的字符串。这个字符串被称为 “加密前的密码”。

加密算法

ERPNext 默认使用 PBKDF2 算法进行密码加密。这个算法需要调用 hashlib 模块中的 pbkdf2_hmac 函数。 ERPNext 调用这个函数时使用了特定的参数,包括:

  • 哈希算法:默认为 SHA512。
  • 加密次数:默认为 100,000 次。
  • 盐字节数:默认为 8 字节。
  • 生成的密码字节数:默认为 32 字节。
获取密码字段的方法

要获取 ERPNext 中的密码字段,需要先获取到数据库中存储的加密前的密码和盐。你可以使用 Frappe 的 get_value 函数来实现:

import frappe

# 获取 User doctype 中 ID 为 "USERID" 的文档
user_doc = frappe.db.get_value("User", {"name": "USERID"}, ["password", "salt"])

if user_doc:
    encrypted_password = user_doc[0]
    salt = user_doc[1]
else:
    print("User not found")

值得注意的是,在获取到加密前的密码和盐之后,你不能直接将这些值传递给 Frappe 或 ERPNext 中的任何函数。相反,你需要在运行时通过 hashlib 重新生成加密后的密码,然后再传递给 ERPNext。

import hashlib

# 重新生成加密后的密码
password = "mypassword"
salt_bytes = bytes(salt, "utf-8")
hashlib_pbkdf2 = hashlib.pbkdf2_hmac("sha512", bytes(password, "utf-8"), salt_bytes, 100000, 32)
encrypted_password = hashlib_pbkdf2.hex()

# 将加密后的密码传递给 Frappe/ERPNext
frappe.local.login_manager.check_password("USERID", password)
结论

在 ERPNext 中获取密码字段需要进行多个步骤,涉及到了加密和哈希算法。因此,你需要着重考虑安全性和代码正确性。本文提供的代码片段可以让你从数据库中获取密码字段并且检查用户的输入密码是否正确。