searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

账户体系设计

2024-09-04 09:42:33
19
0

1:系统架构

1.1 业务全图

  1. 账户在管理后台进行管理,包含账号注册和编辑和删除功能,支持主子账号;
  2. 用户登录需要经过统一认证中心进行验证和鉴权,鉴权通过后在访问其他后台应用。

1.2 表结构设计

user(用户表):用户信息,包含密码、手机号等
role(角色表):自定义角色
privilege(权限表):三元组权限code等
user_role(用户角色映射表):用户和角色的绑定关系,用户可有多个角色
role_privilege(角色权限映射表):角色和权限的绑定关系,每个角色可以有多个权限点

3:设计要点

3.1 用户、角色和权限

用户体系设计中的“角色”和“权限”通常通过角色-权限(Role-Based Access Control, RBAC)模型来定义和管理。在RBAC模型中,权限被分配给角色,而用户则被分配到不同的角色中。这样,用户通过其所属的角色间接获得权限。
在这个模型中:
  • 用户:系统中的个体,可以是人、系统进程或任何需要访问控制的实体。
  • 角色:一组权限的集合,用于定义用户在系统中可以执行的操作。角色可以有不同的级别或类型,例如“管理员”、“编辑者”、“访客”等。
  • 权限:定义了对系统资源的访问能力,例如读取、写入、修改、删除等。
角色和权限的关系通常是多对多的,即一个角色可以拥有多个权限,同时一个权限也可以被多个角色所拥有。用户和角色的关系也是多对多的,即一个用户可以拥有多个角色,同时一个角色也可以被多个用户所拥有。

3.2 信息安全

为确保系统的安全性,我们采用了多种的加密方式来保护数据的安全。
一、前后端密码传输采用 RSA公私钥加密
在前后端密码传输过程中,采用了 RSA 公钥加密和私钥解密的方式,前端使用公钥对密码进行加密处理,而后端则运用私钥进行解密操作。这种加密机制极大地保障了密码传输的安全性,有效防止密码在传输过程中被恶意窃取或篡改。
二、用户密码保存在数据库采用加盐后 SHA-256 加密
对于用户密码在数据库中的保存,采用了加盐后 SHA-256 加密的方式。这种方式具有诸多显著优势。
  • 抗碰撞性:SHA-256 算法具有很强的抗碰撞性,即很难找到两个不同的输入产生相同的哈希值。这使得攻击者难以通过暴力破解等方式获取原始密钥。
  • 加盐增加安全性:加盐是在原始数据(密钥)中添加随机的额外数据,然后再进行哈希运算。这样即使多个用户使用相同的密钥,经过加盐处理后,在数据库中的存储形式也会完全不同,大大增加了破解的难度。
  • 保护数据库安全:如果数据库被攻击,攻击者也很难从哈希值中还原出原始密钥,从而有效保护了系统的整体安全。
public static String hashPassword(String password, String salt) {
    try {
        String combined = password + salt;
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hash = digest.digest(combined.getBytes(StandardCharsets.UTF_8));
        StringBuilder hexString = new StringBuilder();
        for (byte b : hash) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
        return null;
    }
}

public static String generateSalt() {
    Random random = new Random();
    StringBuilder salt = new StringBuilder();
    for (int i = 0; i < 16; i++) {
        int randomNumber = random.nextInt(128);
        salt.append((char) randomNumber);
    }
    return salt.toString();
}
三、手机号、邮箱等敏感信息采用 AES加密的方式存储在数据库
在存储名字、手机号、邮箱等用户敏感信息时,采用 AES(Advanced Encryption Standard)加密方式将其存储于数据库,与 RSA 加密方式相比,运算速度更快。虽然 RSA 加密也很安全,但对于大量敏感信息的存储和频繁的加密解密操作,AES 加密在性能和安全性的平衡上更具优势。
0条评论
0 / 1000
c****k
4文章数
0粉丝数
c****k
4 文章 | 0 粉丝
c****k
4文章数
0粉丝数
c****k
4 文章 | 0 粉丝
原创

账户体系设计

2024-09-04 09:42:33
19
0

1:系统架构

1.1 业务全图

  1. 账户在管理后台进行管理,包含账号注册和编辑和删除功能,支持主子账号;
  2. 用户登录需要经过统一认证中心进行验证和鉴权,鉴权通过后在访问其他后台应用。

1.2 表结构设计

user(用户表):用户信息,包含密码、手机号等
role(角色表):自定义角色
privilege(权限表):三元组权限code等
user_role(用户角色映射表):用户和角色的绑定关系,用户可有多个角色
role_privilege(角色权限映射表):角色和权限的绑定关系,每个角色可以有多个权限点

3:设计要点

3.1 用户、角色和权限

用户体系设计中的“角色”和“权限”通常通过角色-权限(Role-Based Access Control, RBAC)模型来定义和管理。在RBAC模型中,权限被分配给角色,而用户则被分配到不同的角色中。这样,用户通过其所属的角色间接获得权限。
在这个模型中:
  • 用户:系统中的个体,可以是人、系统进程或任何需要访问控制的实体。
  • 角色:一组权限的集合,用于定义用户在系统中可以执行的操作。角色可以有不同的级别或类型,例如“管理员”、“编辑者”、“访客”等。
  • 权限:定义了对系统资源的访问能力,例如读取、写入、修改、删除等。
角色和权限的关系通常是多对多的,即一个角色可以拥有多个权限,同时一个权限也可以被多个角色所拥有。用户和角色的关系也是多对多的,即一个用户可以拥有多个角色,同时一个角色也可以被多个用户所拥有。

3.2 信息安全

为确保系统的安全性,我们采用了多种的加密方式来保护数据的安全。
一、前后端密码传输采用 RSA公私钥加密
在前后端密码传输过程中,采用了 RSA 公钥加密和私钥解密的方式,前端使用公钥对密码进行加密处理,而后端则运用私钥进行解密操作。这种加密机制极大地保障了密码传输的安全性,有效防止密码在传输过程中被恶意窃取或篡改。
二、用户密码保存在数据库采用加盐后 SHA-256 加密
对于用户密码在数据库中的保存,采用了加盐后 SHA-256 加密的方式。这种方式具有诸多显著优势。
  • 抗碰撞性:SHA-256 算法具有很强的抗碰撞性,即很难找到两个不同的输入产生相同的哈希值。这使得攻击者难以通过暴力破解等方式获取原始密钥。
  • 加盐增加安全性:加盐是在原始数据(密钥)中添加随机的额外数据,然后再进行哈希运算。这样即使多个用户使用相同的密钥,经过加盐处理后,在数据库中的存储形式也会完全不同,大大增加了破解的难度。
  • 保护数据库安全:如果数据库被攻击,攻击者也很难从哈希值中还原出原始密钥,从而有效保护了系统的整体安全。
public static String hashPassword(String password, String salt) {
    try {
        String combined = password + salt;
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hash = digest.digest(combined.getBytes(StandardCharsets.UTF_8));
        StringBuilder hexString = new StringBuilder();
        for (byte b : hash) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
        return null;
    }
}

public static String generateSalt() {
    Random random = new Random();
    StringBuilder salt = new StringBuilder();
    for (int i = 0; i < 16; i++) {
        int randomNumber = random.nextInt(128);
        salt.append((char) randomNumber);
    }
    return salt.toString();
}
三、手机号、邮箱等敏感信息采用 AES加密的方式存储在数据库
在存储名字、手机号、邮箱等用户敏感信息时,采用 AES(Advanced Encryption Standard)加密方式将其存储于数据库,与 RSA 加密方式相比,运算速度更快。虽然 RSA 加密也很安全,但对于大量敏感信息的存储和频繁的加密解密操作,AES 加密在性能和安全性的平衡上更具优势。
文章来自个人专栏
账户体系
3 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0