騰訊云 OCR 前端使用 crypto-js 加解密庫生成簽名串

騰訊云 OCR-通用印刷體識別接口中其中一步是關(guān)于鑒權(quán)簽名

文檔示例中以后端(PHP NodeJS 等為例)卻沒有前端部分的調(diào)用方式(估計是非常規(guī)方式進行調(diào)用)代咸,基于技術(shù)研究原因與好奇心下還是覺得既然是 http 接口侄泽,前端應(yīng)該也能調(diào)用祭饭,并開始 coding...

前端利用 jquery(1.11.3)發(fā)送請求吕座,過程中卡在加密這個步驟中盈匾,加密使用的是 crypto-js

先按接口文檔拼接簽名字符串通過 crypto-jsHMAC-SHA1 進行加密忿薇,但發(fā)現(xiàn)加密這步驟并非如此簡單。
無論怎樣生成簽名串岳链,前端調(diào)用返回的都是 bad request,并且提示信息不清晰劲件,不知哪個環(huán)節(jié)出問題掸哑,后來只能利用啟動 wamp 借助官方文檔中 php 生成簽名的例子 + postman 作嘗試,終于成功零远,發(fā)現(xiàn)忽略了一個重點(我漏了“將 orignal 附加到簽名結(jié)果的末尾”這個步驟):

使用 HMAC-SHA1 算法對請求進行加密(SHA1算法加密后的輸出必須是原始的二進制數(shù)據(jù)苗分,否則簽名失敗)牵辣;

對 orignal 使用 HMAC-SHA1 算法進行簽名摔癣,然后將 orignal 附加到簽名結(jié)果的末尾,再進行 Base64 編碼纬向,得到最終的 sign择浊;


php 中是這樣反映出來(.$srcStr)

$signStr = base64_encode(hash_hmac('SHA1', $srcStr, $secret_key, true).$srcStr);

前端 crypto-js 庫加密的問題就出在這里,php 中 hash_hmac('SHA1', $srcStr, $secret_key, true)是生成二進制數(shù)據(jù)逾条,但居然能拼接 $srcStr 源簽名串

但前端 crypto-js 這樣拼接字符串是會出錯的

originalStr = `a=${appid}&b=&k=${secretId}&e=${expired}&t=${time}&r=${random}&u=0&f=`;
sign = CryptoJS.HmacSHA1(originalStr, secretKey) + originalStr; // 拼接字符串
authorization = CryptoJS.enc.Base64.stringify(sign); // TypeError: t.clamp is not a function


然后查看 Node JS 簽名示例

bin = Buffer.concat([res,data]);

看到 Buffer concat 方法琢岩,想 HmacSHA1 出來的是一個 wordArray 類型(二進制數(shù)據(jù)?)师脂,crypto Base64 拼接字符串會出錯担孔,但是否會有像 Buffer 這樣的 concat 方法,果然最終居然在 wordArray 中找到 concat 方法吃警,多番嘗試下中與成功糕篇!

originalStr = `a=${appid}&b=&k=${secretId}&e=${expired}&t=${time}&r=${random}&u=0&f=`,
originalStrWordArray = CryptoJS.enc.Utf8.parse(originalStr), // 將源簽名串解析成 wordArray 類型
signWordArray = CryptoJS.HmacSHA1(originalStr, secretKey),
concatWordArray = signWordArray.concat(originalStrWordArray), // 通過 wordArray concat 將兩個數(shù)據(jù)進行拼接合并
authorization = CryptoJS.enc.Base64.stringify(concatWordArray); // 最終進行 Base64 編碼,成功生成簽名串


這次分享有經(jīng)驗的大神可能很快就知道如何處理酌心,但于我而言拌消,就拼接這里確實卡了很長一段時間,查 crypto-js 用法沒提到 concat 谒府,就在想放棄前端生成簽名串的時候拼坎,再看 nodejs 居然發(fā)現(xiàn)了這個方法浮毯,在前端調(diào)用接口成功的那一刻,那種成功感真的滿滿泰鸡,因此就在這里分享债蓝,并當(dāng)留念,鼓舞自己繼續(xù)前進盛龄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饰迹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子余舶,更是在濱河造成了極大的恐慌啊鸭,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匿值,死亡現(xiàn)場離奇詭異赠制,居然都是意外死亡,警方通過查閱死者的電腦和手機挟憔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門钟些,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绊谭,你說我怎么就攤上這事政恍。” “怎么了达传?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵篙耗,是天一觀的道長。 經(jīng)常有香客問我宪赶,道長宗弯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任逊朽,我火速辦了婚禮罕伯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘叽讳。我一直安慰自己追他,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布岛蚤。 她就那樣靜靜地躺著邑狸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涤妒。 梳的紋絲不亂的頭發(fā)上单雾,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼硅堆。 笑死屿储,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的渐逃。 我是一名探鬼主播够掠,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼茄菊!你這毒婦竟也來了疯潭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤面殖,失蹤者是張志新(化名)和其女友劉穎竖哩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脊僚,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡相叁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吃挑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钝荡。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖舶衬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赎离,我是刑警寧澤逛犹,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站梁剔,受9級特大地震影響虽画,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜荣病,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一码撰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧个盆,春花似錦脖岛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至终惑,卻和暖如春绍在,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工偿渡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留臼寄,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓溜宽,卻偏偏與公主長得像吉拳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子坑质,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Node.js是目前非澈衔洌火熱的技術(shù),但是它的誕生經(jīng)歷卻很奇特涡扼。 眾所周知稼跳,在Netscape設(shè)計出JavaScri...
    w_zhuan閱讀 3,616評論 2 41
  • Node.js是目前非常火熱的技術(shù)吃沪,但是它的誕生經(jīng)歷卻很奇特汤善。 眾所周知,在Netscape設(shè)計出JavaScri...
    Myselfyan閱讀 4,072評論 2 58
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 29,394評論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,105評論 1 32
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,338評論 0 6