【问题标题】:Any way to mimic port password encryption to python?有什么方法可以模仿python的端口密码加密吗?
【发布时间】:2018-11-07 19:01:01
【问题描述】:

一些旧版 Java 使用名为 jasypt 的包来加密密码。
它使用StrongPasswordEncryptor 来加密密码。

似乎在下面使用,来自他们的文档页面
算法:SHA-256。
盐大小:16 字节。
迭代次数:100000。

有源码shows

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

现在我们不再使用 Java,我们想继续在 python 中进行相同的加密,但不确定如何移植这部分代码。

我确实有盐和一对纯文本密码和加密密码来验证python端口是否正常工作,只是不知道要加密什么库和什么函数。尝试hashlib.pbkdf2_hmac 没有任何运气。

示例纯文本密码为:Testing123
盐是:0DD2E486FAE5B121491CBE78A9B67AF1
加密密码为:D1JAI76bwIkEkOIy7IZoLasAFKX0Yy7ujU/M7UBezC7NqxSD3clDyaFB1lz96K98

这里是实际加密密码的 Java 代码中的 sn-p:

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);
    }

}

【问题讨论】:

  • 试试看哈希是否匹配?
  • @SLaks 不确定如何在 python 中创建哈希。累了的哈希列表用给定的信息模仿它,但没有运气。也许我应该下载他们的 jar 并通过它,但那是太多的活动部分。
  • 算法描述is on the page you linked,为什么不能用这个?
  • @LukeJoshuaPark 我对 Java 和加密都不熟悉。该摘要函数是否布局了它如何加密字符串?
  • @taesu 密码未加密,仅创建加盐哈希(摘要)。要验证密码,您需要按照 Luke 提供的链接创建提供的明文密码和存储盐的摘要。如果它们匹配,则密码也将匹配。每个密码的盐应该是唯一的

标签: java python-3.x encryption sha256 jasypt


【解决方案1】:

好的,我现在解决了一半:

这是一个检查给定密码是否有效的简化 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;
}

【讨论】:

  • 我知道,但我更关心端口 jasypt 的 StrongPasswordEncryptor 到 python,因此我们可以继续以相同的方式验证哈希和加密密码。
  • @taesu 哦,我明白了。然后请提供一些输出示例。我试着模仿它
  • @taesu 我无法在 Java 中获得与您相同的输出。您能否提供一个如何在 Java 中获取该输出的示例?你在哪里放盐?
  • @taesu 我们可以将其翻译成 Python。不用担心
  • @taesu 嘿,我已经完成了一半,但现在需要走了。明天或周末会尝试看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 2011-06-29
相关资源
最近更新 更多