如何在 ColdFusion 中使用 jargon2-api?

问题描述

我必须在 Adob​​e ColdFusion 2018 中实现 Argon2 哈希。我发现了两个可以使用的 Java 绑定:

  1. argon2-jvm:https://github.com/phxql/argon2-jvm
  2. jargon2-api:https://github.com/kosprov/jargon2-api

我成功集成的第一个。它运行良好,唯一的问题是它不允许传递 'pepper' 字符串(也称为 'secret')。

所以我也尝试集成其他绑定。为了解决依赖性问题,我使用了 JavaLoader (https://github.com/markmandel/JavaLoader)。我通过 Maven 获得的罐子。

但是,我收到以下异常:

Typ | java.lang.UnsatisfiedLinkError
Diagnose | Unable to load library 'argon2': Das angegebene Modul wurde nicht gefunden. Das angegebene Modul wurde nicht gefunden. Das angegebene Modul wurde nicht gefunden. Native library (win32-x86-64/argon2.dll) not found in resource path ([file:/D:/ColdFusion2018/cfusion/lib/updates/chf20180010.jar,

代码如下:

component name="Argon2Kosprov" output="false" {

    public function init(string pepper = "pepper") {

        getJavaLoader();
        
        // More info about the API: https://github.com/kosprov/jargon2-api

        local.jargon2 = variables.javaLoader.create("com.kosprov.jargon2.api.Jargon2");
    
        variables.hasher = local.jargon2.jargon2Hasher();
        
        initConstants();

        variables.hasher.type(variables.argon2Type); 
        
        // Parameters
        variables.hasher.memoryCost(65536);         // 64MB memory cost
        variables.hasher.timeCost(3);               // 3 passes through memory
        variables.hasher.parallelism(4);            // use 4 lanes and 4 threads
        variables.hasher.saltLength(16);            // 16 random bytes salt
        variables.hasher.hashLength(16);            // 16 bytes output hash     
        applyPepper(arguments.pepper);
        
        // Just get a hold on the verifier. No special configuration needed.
        variables.verifier = local.jargon2.jargon2Verifier();

        return this;
    }


    public void function applyPepper(required string pepper) {
        
        local.binaryValue = stringToBinary(arguments.pepper);       
        variables.hasher.secret(local.binaryValue);
        
    }


    public string function hashString(required string string) {     
    
        // Set the password and calculate the encoded hash      
        local.binaryValue = stringToBinary(arguments.string);
        
        local.encodedHash = variables.hasher.password(local.binaryValue).encodedHash();
        
        return local.encodedHash;       
    }


    public boolean function checkString(required string string,required string hash) {
        // Set the encoded hash,the password and verify
        return variables.verifier.hash(arguments.hash).password(arguments.string).verifyEncoded();
    }


    // private functions    
    private void function initConstants() {     
        local.argon2Types = variables.javaLoader.create("com.kosprov.jargon2.api.Jargon2$Type");                
        final variables.argon2Type = local.argon2Types.ARGON2id
    }
    
        
    /**
    * @hint Load specific .jar files using JavaLoader
    * */
    private component function getJavaLoader() {

        if (NOT StructKeyExists(variables,"javaLoader")) { 
            local.jararray = [                              
                Expandpath("/jars/net/java/dev/jna/jna/5.6.0/jna-5.6.0.jar"),Expandpath("/jars/com/nativelibs4java/ochafik-util/0.12/ochafik-util-0.12.jar"),Expandpath("/jars/com/nativelibs4java/jnaerator-runtime/0.12/jnaerator-runtime-0.12.jar"),Expandpath("/jars/com/kosprov/jargon2/jargon2-native-ri-backend/1.1.1/jargon2-native-ri-backend-1.1.1.jar"),Expandpath("/jars/com/kosprov/jargon2/jargon2-native-ri-binaries-generic/1.1.1/jargon2-native-ri-binaries-generic-1.1.1.jar"),Expandpath("/jars/com/kosprov/jargon2/jargon2-api/1.1.1/jargon2-api-1.1.1.jar")
            ];
            
            variables.javaLoader = CreateObject("component","lib.shared.javaloader.JavaLoader").init(local.jararray);
        
        }

        return variables.javaLoader;
    }


    private any function stringToBinary(required string) {      
        local.base64Value = toBase64(arguments.string);
        local.binaryValue = toBinary(base64Value);
        return local.binaryValue;
    }
    
}

它是这样调用的:

 <cfset local.argon = new lib.shared.argon2.Argon2Kosprov()>
 <cfset local.password = "alabala"> 
 <cfset local.hash = local.argon.hashString(local.password).encodedHash()>

然后出现异常,说找不到 DLL。 DLL 在 JAR 中,不应单独加载。

有没有人偶然成功地将这种 Argon2 绑定集成到 Coldfusion 中?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)