Vues :

Comportement :
Lorsque vous créez une URL avec PHP, par exemple, vous recevez le message d'erreur suivant lorsque vous essayez d'y accéder:


500 - Internal Server Error
DocuWare.Gapi.Utils.Web.DWIntegrations.EX_INVALID_PASS_PHRASE


Solution :
Ce problème est dû au fait que l'URL n'est pas correctement cryptée. Les éléments suivants doivent être pris en compte lors du cryptage :

La phrase de passe utilise un algorithme de cryptage symétrique. Advanced Encryption Standard (AES) conformément à la spécification FIPS-197.
Les paramètres suivants sont utilisés :

  • Taille du bloc = 128 bits
  • Taille du chiffrement = CBC (Cipher Block Chaining)
  • Vecteur d'initialisation (IV) = 128 bits
  • Longueur de la clé = 256 bits
  • Pas de sel
  • Rembourrage PKCS7

Lecodage Base64 est requis deux fois. Les paramètres &lc et &q doivent être codés en Base64. Ensuite, tous les paramètres sont cryptés et le résultat doit être à nouveau codé en Base64.

Voici un exemple JavaScript qui peut être utilisé avec le langage PHP :


var dwuser = "<USERNAME>" ;
var dwpass = "<PASSWORD>" ;
var docid = "6" ;
var cabinetid = "File Cabinet GUID" ;

var key = encodeURI("PASSPHRASE") ;
var passphrase = 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('[Index Field]='+docid)) ;

var url = "https://server.docuware.cloud/DocuWare/Platform/WebClient/1/Integration" ;
var encrypturl = "&p=V&lc="+loginstring+"&fc="+cabinetid
encrypturl += "&q="+searchstring+"&dt=Download" ;
console.log("before encryption\n" + encrypturl) ;
var ep = encrypt(encrypturl, encryption_key, iv) ;
console.log("Encypted\n" + ep) ;
ep = convertToUrlTokenFormat(ep) ;
console.log("Encrypted in Base64 URL token format\n" + ep) ;
url += "?&ep=" + ep ;

console.log("URL : " + url) ;

function sha512(str) {
return (CryptoJS.SHA512(str)).toString(CryptoJS.enc. Hex) ;
}

function convertToUrlTokenFormat(str) {
// Compte les égalités pour le padding
var padding = (str.split("=").length - 1);
// Supprimer les égalités
var returnVal = str.replace(/=/g,"");
// Ajouter le padding
returnVal = returnVal + padding;
// Changer + en - et / en _
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 applicable pour les organisations en nuage et sur site.

Veuillez noter : Cet article est une traduction de l'anglais. Les informations contenues dans cet article sont basées sur la ou les versions originales des produits en langue anglaise. Il peut y avoir des erreurs mineures, notamment dans la grammaire utilisée dans la version traduite de nos articles. Bien que nous ne puissions pas garantir l'exactitude complète de la traduction, dans la plupart des cas, vous la trouverez suffisamment informative. En cas de doute, veuillez revenir à la version anglaise de cet article.