跳转至

用户密码的加密及解密

本文档内容来源于 http://doc.myapps.cn/docs/common-script/common-script-1f1a4b0e6sk5f

脚本说明

该脚本用于对用户密码进行加密和解密操作。在MyApps平台中,密码通常需要加密存储,可以使用平台提供的加密工具类进行密码的加密和解密。

密码加密

方式1:使用平台加密工具加密密码

(function(){
    var password = "原始密码";
    var Security = new Packages.cn.myapps.common.util.Security();
    var encryptedPassword = Security.encryptPassword(password);

    return encryptedPassword;
})();

方式2:使用MD5加密密码

(function(){
    var password = "原始密码";
    var MessageDigest = Packages.java.security.MessageDigest;
    var md = MessageDigest.getInstance("MD5");
    var bytes = md.digest(password.getBytes("UTF-8"));

    var sb = new Packages.java.lang.StringBuilder();
    for(var i = 0; i < bytes.length; i++){
        var hex = Integer.toHexString(0xff & bytes[i]);
        if(hex.length == 1){
            sb.append('0');
        }
        sb.append(hex);
    }

    return sb.toString();
})();

方式3:使用SHA-256加密密码

(function(){
    var password = "原始密码";
    var MessageDigest = Packages.java.security.MessageDigest;
    var md = MessageDigest.getInstance("SHA-256");
    var bytes = md.digest(password.getBytes("UTF-8"));

    var sb = new Packages.java.lang.StringBuilder();
    for(var i = 0; i < bytes.length; i++){
        var hex = Integer.toHexString(0xff & bytes[i]);
        if(hex.length == 1){
            sb.append('0');
        }
        sb.append(hex);
    }

    return sb.toString();
})();

方式4:使用Base64编码(简单编码,非加密)

(function(){
    var password = "原始密码";
    var Base64 = Packages.java.util.Base64;
    var encoder = Base64.getEncoder();
    var encoded = encoder.encodeToString(password.getBytes("UTF-8"));

    return encoded;
})();

密码解密

方式1:使用平台解密工具解密密码

(function(){
    var encryptedPassword = "加密后的密码";
    var Security = new Packages.cn.myapps.common.util.Security();
    var decryptedPassword = Security.decryptPassword(encryptedPassword);

    return decryptedPassword;
})();

方式2:Base64解码(简单解码)

(function(){
    var encodedPassword = "编码后的密码";
    var Base64 = Packages.java.util.Base64;
    var decoder = Base64.getDecoder();
    var decoded = new Packages.java.lang.String(decoder.decode(encodedPassword), "UTF-8");

    return decoded;
})();

密码验证

方式1:验证密码是否正确

(function(){
    var inputPassword = "用户输入的密码";
    var storedPassword = "存储的加密密码";

    // 加密用户输入的密码
    var Security = new Packages.cn.myapps.common.util.Security();
    var encryptedInput = Security.encryptPassword(inputPassword);

    // 比较加密后的密码
    if(encryptedInput === storedPassword){
        return true;
    }

    return false;
})();

方式2:验证用户密码(通过用户对象)

(function(){
    var userId = "用户ID";
    var inputPassword = "用户输入的密码";

    var user = getUserById(userId);
    if(user != null){
        var storedPassword = user.getPassword();

        // 加密用户输入的密码
        var Security = new Packages.cn.myapps.common.util.Security();
        var encryptedInput = Security.encryptPassword(inputPassword);

        // 比较密码
        if(encryptedInput === storedPassword){
            return "密码正确";
        }else{
            return "密码错误";
        }
    }

    return "用户不存在";
})();

方式3:使用MD5验证密码

(function(){
    var inputPassword = "用户输入的密码";
    var storedHash = "存储的MD5哈希值";

    // 计算输入密码的MD5
    var MessageDigest = Packages.java.security.MessageDigest;
    var md = MessageDigest.getInstance("MD5");
    var bytes = md.digest(inputPassword.getBytes("UTF-8"));

    var sb = new Packages.java.lang.StringBuilder();
    for(var i = 0; i < bytes.length; i++){
        var hex = Integer.toHexString(0xff & bytes[i]);
        if(hex.length == 1){
            sb.append('0');
        }
        sb.append(hex);
    }

    var inputHash = sb.toString();

    if(inputHash.equalsIgnoreCase(storedHash)){
        return true;
    }

    return false;
})();

扩展示例

示例1:更新用户密码

(function(){
    var userId = "用户ID";
    var newPassword = "新密码";

    // 加密新密码
    var Security = new Packages.cn.myapps.common.util.Security();
    var encryptedPassword = Security.encryptPassword(newPassword);

    // 更新用户密码
    var sql = "UPDATE t_user SET password = '" + encryptedPassword + "' WHERE id = '" + userId + "'";
    updateByDSName("数据源名称", sql);

    return "密码更新成功";
})();

示例2:重置用户密码为默认密码

(function(){
    var userId = "用户ID";
    var defaultPassword = "123456";  // 默认密码

    // 加密默认密码
    var Security = new Packages.cn.myapps.common.util.Security();
    var encryptedPassword = Security.encryptPassword(defaultPassword);

    // 更新用户密码
    var sql = "UPDATE t_user SET password = '" + encryptedPassword + "' WHERE id = '" + userId + "'";
    updateByDSName("数据源名称", sql);

    return "密码已重置为默认密码";
})();

示例3:批量重置多个用户密码

(function(){
    var userIds = ["用户ID1", "用户ID2", "用户ID3"];
    var defaultPassword = "123456";

    // 加密默认密码
    var Security = new Packages.cn.myapps.common.util.Security();
    var encryptedPassword = Security.encryptPassword(defaultPassword);

    var successCount = 0;
    var failCount = 0;

    for(var i = 0; i < userIds.length; i++){
        try{
            var sql = "UPDATE t_user SET password = '" + encryptedPassword + "' WHERE id = '" + userIds[i] + "'";
            updateByDSName("数据源名称", sql);
            successCount++;
        }catch(e){
            failCount++;
        }
    }

    return "成功: " + successCount + ", 失败: " + failCount;
})();

示例4:密码强度验证

(function(){
    var password = "用户输入的密码";
    var errors = [];

    // 检查密码长度
    if(password == null || password.length < 8){
        errors.push("密码长度至少8位");
    }

    // 检查是否包含数字
    if(!password.matches(".*\\d.*")){
        errors.push("密码必须包含数字");
    }

    // 检查是否包含字母
    if(!password.matches(".*[a-zA-Z].*")){
        errors.push("密码必须包含字母");
    }

    // 检查是否包含特殊字符
    if(!password.matches(".*[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?].*")){
        errors.push("密码必须包含特殊字符");
    }

    if(errors.length > 0){
        return errors.join("; ");
    }

    return "密码强度符合要求";
})();

示例5:生成随机密码

(function(){
    var length = 12;  // 密码长度
    var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*";
    var random = new Packages.java.util.Random();
    var password = new Packages.java.lang.StringBuilder();

    for(var i = 0; i < length; i++){
        var index = random.nextInt(chars.length);
        password.append(chars.charAt(index));
    }

    return password.toString();
})();

示例6:密码加密并存储

(function(){
    var userId = "用户ID";
    var newPassword = "新密码";

    // 加密密码
    var Security = new Packages.cn.myapps.common.util.Security();
    var encryptedPassword = Security.encryptPassword(newPassword);

    // 获取用户对象并更新密码
    var user = getUserById(userId);
    if(user != null){
        user.setPassword(encryptedPassword);
        // 保存用户(假设有保存方法)
        // userProcess.doUpdate(user);
        return "密码更新成功";
    }

    return "用户不存在";
})();

示例7:比较两个密码是否相同

(function(){
    var password1 = "密码1";
    var password2 = "密码2";

    // 加密两个密码
    var Security = new Packages.cn.myapps.common.util.Security();
    var encrypted1 = Security.encryptPassword(password1);
    var encrypted2 = Security.encryptPassword(password2);

    if(encrypted1 === encrypted2){
        return "两个密码相同";
    }else{
        return "两个密码不同";
    }
})();

示例8:密码加密工具函数

// 密码加密函数
function encryptPassword(password){
    var Security = new Packages.cn.myapps.common.util.Security();
    return Security.encryptPassword(password);
}

// 密码验证函数
function verifyPassword(inputPassword, storedPassword){
    var Security = new Packages.cn.myapps.common.util.Security();
    var encryptedInput = Security.encryptPassword(inputPassword);
    return encryptedInput === storedPassword;
}

// 使用示例
(function(){
    var password = "原始密码";
    var encrypted = encryptPassword(password);
    println("加密后的密码: " + encrypted);

    var isValid = verifyPassword("原始密码", encrypted);
    println("密码验证结果: " + isValid);

    return encrypted;
})();

关键函数说明

  • Packages.cn.myapps.common.util.Security(): MyApps平台的加密工具类
  • Security.encryptPassword(password): 加密密码
  • Security.decryptPassword(encryptedPassword): 解密密码(如果支持)
  • Packages.java.security.MessageDigest: Java消息摘要类,用于MD5、SHA等加密
  • Packages.java.util.Base64: Base64编码解码工具
  • getUserById(userId): 根据用户ID获取用户对象
  • user.getPassword(): 获取用户密码(加密后的)
  • user.setPassword(password): 设置用户密码

密码加密说明

加密方式

  1. 平台加密工具: 使用MyApps平台提供的Security工具类,这是推荐的方式
  2. MD5: 单向哈希算法,不可逆,常用于密码验证
  3. SHA-256: 更安全的哈希算法,不可逆
  4. Base64: 编码方式,不是加密,可以解码

密码存储

  • 密码通常以加密后的形式存储在数据库中
  • 验证时,将用户输入的密码加密后与存储的加密密码比较
  • 不建议存储明文密码

注意事项

  • ⚠️ 安全性: 密码加密是单向的,MD5和SHA等哈希算法无法解密
  • ⚠️ 密码强度: 建议设置密码强度要求(长度、复杂度等)
  • ⚠️ 加密方式: 使用平台提供的加密工具,确保加密方式一致
  • ⚠️ 密码重置: 重置密码时需要加密后再存储
  • ⚠️ 密码验证: 验证时加密用户输入的密码,然后与存储的加密密码比较
  • ⚠️ SQL注入: 更新密码时注意防止SQL注入攻击
  • MD5和SHA是单向哈希,无法解密,只能用于验证
  • Base64是编码,不是加密,可以解码
  • 建议使用平台提供的Security工具类进行密码加密

使用场景

  • 用户注册时加密密码
  • 用户登录时验证密码
  • 用户修改密码
  • 管理员重置用户密码
  • 密码强度验证
  • 批量密码重置

如需查看完整脚本代码,请访问源文档链接。