当前位置: 首页 > 知识库问答 >
问题:

有什么方法可以模拟Python的端口密码加密吗?

呼延卓
2023-03-14

一些遗留Java使用名为jasypt的包加密密码。
它使用strongpasswordencryptor加密密码。

 public StrongPasswordEncryptor() {
        super();
        this.digester = new StandardStringDigester();
        this.digester.setAlgorithm("SHA-256");
        this.digester.setIterations(100000);
        this.digester.setSaltSizeBytes(16);
        this.digester.initialize();
    }

示例明文密码为:testing123
盐为:0DD2E486FAE5B121491CBE78A9B67AF1
加密密码为:D1JAI76BWIKEKOIY7IZOLASAFKX0YY7UJU/M7UBEZC7NQXSD3CLDYAFB1LZ96K98

下面是Java代码中实际加密密码的片段:

import javax.inject.Inject;
import javax.inject.Named;
import org.jasypt.util.password.StrongPasswordEncryptor;
import com.foobar.users.PasswordEncoder;

public class PasswordEncoderImpl implements PasswordEncoder {

    private String salt;
    private StrongPasswordEncryptor encryptor;

    @Inject
    public PasswordEncoderImpl(@Named("appHash") String appHash) {
        this.salt = appHash;
        encryptor = new StrongPasswordEncryptor();
    }

    @Override
    public String encode(String password) {
        return encryptor.encryptPassword(password + salt);
    }

    @Override
    public boolean verifyPassword(String password, String encryptedPassword){
        return encryptor.checkPassword(password+salt, encryptedPassword);
    }

}

共有1个答案

何超英
2023-03-14

好吧,我现在有一半的解决办法:

下面是一个简化的Java代码,用于检查给定的密码是否有效:

private void start() throws Exception {

    String salt = "0DD2E486FAE5B121491CBE78A9B67AF1";
    String password = "Testing123";
    String previousResult = "QI2KU2VsI/aNr4U3XQ0AdaOk6Qhl4XTaN2ym5cYXxRr8tz/23EvWQHI8sNhRmoP1";

    StrongPasswordEncryptor passwordEncryptor = new StrongPasswordEncryptor();
    String encryptedPass = passwordEncryptor.encryptPassword(password + salt);


    System.out.println(checkPass(salt, password, previousResult));
    System.out.println(passwordEncryptor.checkPassword(password + salt, previousResult));
}

private boolean checkPass(String salt, String password, String previousResult) throws NoSuchAlgorithmException {
    byte[] bytes = previousResult.getBytes(StandardCharsets.US_ASCII);
    byte[] decode = Base64.getDecoder().decode(bytes);

    byte[] secretSalt = new byte[16];
    System.arraycopy(decode, 0, secretSalt, 0, 16);

    byte [] message = (password + salt).getBytes(StandardCharsets.UTF_8);
    byte[] digest = digest(message, secretSalt);

    return Arrays.equals(digest, decode);
}


private byte[] digest(byte [] message, final byte[] salt) throws NoSuchAlgorithmException {

    byte[] digest;

    MessageDigest md = MessageDigest.getInstance("sha-256");
    md.reset();

    md.update(salt);
    md.update(message);


    digest = md.digest();
    for (int i = 0; i < (100000 - 1); i++) {
        md.reset();
        digest = md.digest(digest);
    }

    byte[] secondArray = digest;
    final byte[] result = new byte[salt.length + secondArray.length];

    System.arraycopy(salt, 0, result, 0, salt.length);
    System.arraycopy(secondArray, 0, result, salt.length, secondArray.length);

    return result;
}
 类似资料:
  • 我理解哈希和加密之间的区别。我正在寻找一种在Python中实现加密/解密字符串的简单方法。我在网上找到的大多数方法都是关于使用散列算法(MD5-SHA-1等)来进行单向散列。但不幸的是,哈希是不可逆的。有什么建议吗?

  • 问题内容: 通常,建议将RSA用于加密对称密钥,然后再将其用于加密“有效负载”。 可以使用RSA加密的数据量的实际(或理论)限制是多少(我使用的是2048位RSA密钥大小)。 特别是,我想知道使用(不同的)RSA公钥加密RSA公钥(256字节)是否安全?我在Java中使用Bouncy Castle加密库。 问题答案: 对于 n 位RSA密钥,直接加密(使用PKCS#1 “旧式”填充)适用于最大 下

  • 我想知道如果在创建用户或更改角色时没有指定ENCRYPTED,那么PostgreSQL使用的默认加密方法(如果有的话)是什么。 我在PostgreSQL网站上看到了以下内容: 密码存储加密默认情况下,数据库用户密码存储为MD5哈希,因此管理员无法确定分配给用户的实际密码。如果MD5加密用于客户端身份验证,则未加密的密码甚至不会暂时出现在服务器上,因为客户端MD5在通过网络发送之前对其进行加密。

  • 就像一个url在浏览器中那样可以直接打开 不用设置header这些东西 有没有这样的库?主要是想获取这个网页的源码

  • 我想为我的更改编写测试,但遇到了问题--更改是在静态方法内进行的。代码如下所示 我想要的是模拟方法A和B,并且doSomething和所有这些在方法C中使用的静态方法,但目前我找不到任何方法来做到这一点。你现在有吗?

  • 问题内容: 我有以下加密数据: 对其进行解密的密码是: (这是来自胡言乱语的例子) 在命令行中使用openssl: 输出为: 使用我的NodeJS应用程序: 我在一行中遇到以下错误。 我想念什么吗?谢谢。 问题答案: 加密的数据以8字节的“魔术”开头,表示存在盐(的ASCII编码)。然后接下来的8个字节是盐。现在是个坏消息:Node.js似乎没有对EVP_BytesToKey方法使用盐: 那是盐。