微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 ColdFusion 中使用 jargon2-api?

如何解决如何在 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 举报,一经查实,本站将立刻删除。