Comportamiento:
Cuando se construye una URL con PHP, por ejemplo, se recibe el mensaje de error al intentar acceder a ella:
500 - Error interno del servidor
DocuWare.Gapi.Utils.Web.DWIntegrations.EX_INVALID_PASS_PHRASE
Solución:
Este problema se produce porque no se ha cifrado correctamente la URL. Se debe tener en cuenta lo siguiente durante el cifrado:
La frase de contraseña utiliza un algoritmo de cifrado simétrico. Advanced Encryption Standard (AES) de acuerdo con la especificación FIPS-197.
Se utilizan los siguientes parámetros:
- Tamaño de bloque = 128 bits
- Tamaño de cifrado = CBC (Cipher Block Chaining)
- Vector de inicialización (IV) = 128 bits
- Longitud de clave = 256 bits
- Sin sal
- Relleno PKCS7
Lacodificación Base64 es requerida dos veces. Los parámetros &lc y &q necesitan ser codificados en Base64. Después, todos los parámetros son encriptados, y el resultado necesita ser codificado en Base64 de nuevo.
El siguiente es un ejemplo JavaScript que puede ser usado con el lenguaje PHP:
vardwuser= "<USERNAME>";
var dwpass = "<PASSWORD>";
var docid = "6";
var cabinetid = "File Cabinet GUID";
var key = encodeURI("PASSPHRASE");
varpassphrase = sha512(key);
var passphraseArray = parseHexString(passphrase);
var encryption_key = createHexString(passphraseArray.splice(0, 8));
var iv = createHexString(passphraseArray.splice(0, 4));
console.log("Passphrase: " + passphrase);
console.log("passphrase array:\n" + passphraseArray);
console.log("Encryption_key: " + encryption_key);
console.log("IV: " + iv);
var loginstring =convertToUrlTokenFormat(window.btoa("User="+dwuser+"\nPwd="+dwpass));
var searchstring = convertToUrlTokenFormat(window.btoa('[Campo de índice]='+docid));
var url = "https://server.docuware.cloud/DocuWare/Platform/WebClient/1/Integration";
varencrypturl= "&p=V&lc="+loginstring+"&fc="+cabinetid
encrypturl += "&q="+searchstring+"&dt=Download";
console.log("antes de cifrar\n" + encrypturl);
var ep = encrypt(encrypturl, encryption_key, iv);
console.log("Cifrado\n" + ep);
ep = convertToUrlTokenFormat(ep);
console.log("Cifrado en formato de token de URL Base64\n" + ep);
url += "?&ep=" + ep;
console.log("URL: " + url);
function sha512(str) {
return (CryptoJS.SHA512(str)).toString(CryptoJS.enc.Hex);
}
function convertToUrlTokenFormat(str) {
// Cuenta iguales para el relleno
var padding = (str.split("=").length - 1);
// Eliminar iguales
var returnVal = str.replace(/=/g,"");
// Añadir relleno
returnVal = returnVal + relleno;
// Cambiar + por - y / por _
returnVal = returnVal.replace(/\+/g,"-");
returnVal = returnVal.replace(/\//g,"_");
return returnVal;
}
function encrypt(str, key, iv) {
var cipher = CryptoJS.AES.encrypt(str, CryptoJS.enc.Hex.parse(key), {
keySize: 256,
blockSize: 128,
iv: CryptoJS.enc.Hex.parse (iv),
padding: CryptoJS. pad.Pkcs7,
mode: CryptoJS. mode.CBC
});
return String(cipher);
}
function parseHexString(str) {
var result = [];
while (str.length >= 8) {
result.push(parseInt(str.substring(0, 8), 16));
str = str.substring(8, str.length );
}
return result;
}
function createHexString(arr) {
var result = "";
var z;
for (var i = 0; i < arr.length; i++) {
var str = arr[i].toString(16);
z = 8 - str.length + 1;
str = Array(z).join("0") + str;
result += str;
}
return result;
}
KBA aplicable a organizaciones en nube y locales.
Tenga en cuenta: Este artículo es una traducción del idioma inglés. La información contenida en este artículo se basa en la(s) versión(es) original(es) del producto(s) en inglés. Puede haber errores menores, como en la gramática utilizada en la versión traducida de nuestros artículos. Si bien no podemos garantizar la exactitud completa de la traducción, en la mayoría de los casos, encontrará que es lo suficientemente informativa. En caso de duda, vuelva a la versión en inglés de este artículo.