動作:
例えばPHPでURLをビルドした場合、アクセスしようとするとエラーメッセージが表示されます:
500 - Internal Server Error
DocuWare.Gapi.Utils.Web.DWIntegrations.EX_INVALID_PASS_PHRASE
解決方法
この問題は、URLが正しく暗号化されていないために発生します。暗号化の際には、以下を考慮する必要があります:
パスフレーズは対称暗号化アルゴリズムを使用します。
以下のパラメータを使用します:
- ブロック・サイズ = 128 ビット
- 暗号サイズ = CBC (暗号ブロック連鎖)
- 初期化ベクトル(IV) = 128 ビット
- 鍵長 = 256 ビット
- ソルトなし
- PKCS7 パディング
Base64エンコーディングは2回必要です。 パラメータ&lcと&qはBase64エンコーディングされる必要があります。 その後、すべてのパラメータが暗号化され、結果は再びBase64エンコーディングされる必要があります。
以下は、PHP言語で使用できるJavaScriptの例です:
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);
console.log("パスフレーズ配列: \n" + passphraseArray);
console.log("暗号化キー: " + 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 encryptionn" + encrypturl);
var ep = encrypt(encrypturl, encryption_key, iv);
console.log("暗号化されました" + ep);
ep = convertToUrlTokenFormat(ep);
console.log("Encrypted in Base64 URL token formatn" + ep);
url += "?&ep=" + ep;
console.log("URL: " + url);
function sha512(str) {
return (CryptoJS.SHA512(str)).toString(CryptoJS.enc.Hex);
}
function convertToUrlTokenFormat(str) {
// パディングに等しいカウント
var padding = (str.split("=").length - 1);
// 等号を削除
var returnVal = str.replace(/=/g,"");
// パディングを追加
returnVal = returnVal + padding;
// + を - に、/ を _ に変更
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。
ご注意:この記事は英語からの翻訳です。この記事に含まれる情報は、オリジナルの英語版製品に基づくものです。翻訳版の記事で使用されている文法などには、細かい誤りがある場合があります。翻訳の正確さを完全に保証することは出来かねますが、ほとんどの場合、十分な情報が得られると思われます。万が一、疑問が生じた場合は、英語版の記事に切り替えてご覧ください。