❶ 如何利用ssm公共配置實現微服務
java ssm審批流程怎麼實現
參數是由前台頁面傳遞過去的,控制層需要定義和前台傳遞的相同參數個數和名稱,如果格式和類型及參數個數都相同的話調用到控制層方法的話參數也就獲取到了,如果獲取失敗的話你還可以試試
String userName = request.getParameter("userName");
String password = request.getParameter("password");
這樣的方式獲取參數
望採納
❷ 訪問微服務 響應時間5秒 怎麼修改
微服務的概念產生是順應這樣的需求:為了開發出速度更快、更有彈性且用戶體驗更佳的應用。這個概念等同於具有可擴展性的自動化系統,在簡單的商業化架構上運行軟體。由於容器所提供的經濟效率,在二0一陸年微服務將是一大主題。 應用快速開發的需求影響到了全部公司,以及如何看待歷來業務安排的方式。來自微服務的新實踐代表著需要小型團隊以對於公司來說陌生的方式——自上而下進行迭代。這意味著企業運作的方式將獲得徹底的改變。 現在在針對應用架構與微服務的新思考方面,容器生態系統逐漸成為核心主題。根據Battery Ventures技術人員Adrian Cockcroft的說法:關於微服務有一些基本的原則需要思考。首先,如今構建軟體的價格更為低廉,容器的出現降低了成本。Docker被所有人納入藍圖——從軟體供應商到終端用戶,所有人都在嘗試找出容器的用法,因為用它就能加快軟體的交付節奏。不過這也代表著要安裝的系統是應用級別的,也就是說在應用的開發、部署與管理方面出現了不同的需求。 Adrian Cockcroft在面向對象軟體架構大會上關於微服務的演講,以卡通形式呈現,作者是Remarker 舉個例子,對於要處理服務與堆棧范圍增長的公司來說,監控比以往更加重要。要想解決問題,必須對數據日誌進行分析,而這些日誌很可能橫跨臨時節點與多項服務。由於需要細化監控與加強工具,從業人員能更好地掌握這些構建模塊對於應用所依賴的許多潛在微服務的影響。 那麼起作用的是什麼呢?從公司與API開始:基於微服務的產品團隊與另一個基於終端的平台團隊之間靠API連接,通過API調用以及企業基礎架構持續作出相應的回應來生效。 微服務被定義為特定背景下松耦合、面向服務的架構,允許在無需理解其他部件運作原理的情況下進行更新。整個服務是跨公司構建的,但所有權卻在同一個地方。微服務架構提供了更多系統間的點對點調用。消息形式必須靈活,所有部件在無論哪個版本中都能運作。這意味著在構建微服務架構時,我們需要一些工具來配置、探索、輸送流量、觀察與構建系統。 IBM傑出的工程師兼IBM雲計算中心的CTO Andrew Hately作出了類比:一5年前人們可能需要每周查看一下自己的銀行余額,而互聯中國允許人們實時查看余額甚至做出進一步操作,也許隨著智能手機的發展,很多事情都發生的改變。如今,人們可以即時訪問自己的賬戶收支信息。這種速度與即時性代表著:在過去的5-一0年內,企業提供服務的發展速度必須跟得上社交中國絡與搜索公司發展的速度。 公司必須處理員工、消費者、系統與所有可能組合之間的持續互動——就像Hately所說的完全互聯與持續可用。這意味著企業流程需要重建,需要將所有東西連接起來。如果公司不進行這方面的嘗試,也無法提供相應功能的話,很快就會面臨收入減少甚至出局的局面。 Hately表示:「工具非常關鍵。」 有數百家中國站不支持代碼,收到反饋後,在下一組測試用例中消費者就能使用它了。這種嚴格的開發過程提供了一種企業工作方式,也為微服務發展提供了思考方式。DevOps中的ops也會執行這樣的工作。如果你有一小段代碼並為其定義指標的話,就能細分出哪些會成功,哪些會失敗。 IBM通過為消費者及內部團隊構建反饋通道與成功標准,在敏捷、DevOps、精益生產與其他迭代進程中結合最佳實踐,創建了名為IBM Bluemix Garage Method方法的企業方法論。IBM Bluemix Garage Method方法將企業解決方案的可靠性及可測試性與最新開放社區在規模質量上的最佳實踐結合起來,持續創新、創建持續交付渠道並在雲平台上進行部署。這種方法很有價值,向所有人開放資源能夠提高個人、團隊與全公司的DevOps技能,以及管理與監控能力。 軟體相關的契約 第一代的容器管理平台支持這些速度更快的開發進程。Docker的產品高級VP Scott Johnston表示,在Docker Compose中,微服務促進了工具發展,YAML文件扮演了描述不同組件的清單(manifest)。Compose讓開發人員得以用抽象的方式描述多容器應用,它可以描述web容器、資料庫容器、負載均衡及其間的邏輯關系,無需連中國或部署存儲。 Engine Yard的Matt Butcher表示:微服務是軟體相關的契約。有些人會辯稱微服務是正確執行的面向服務架構(SOA)。開發者想要的是有用、功能豐富且結構優雅的架構。微服務使得軟體開發回歸Unix的根源——將一件事完成得可以。用Unix可以任意輸出命令。微服務不止在如何優秀地完成工作方面,同時在如何與環境互動方面也表現出契約性。如果運行良好,它所做的工作就像是優秀的Unix shell腳本。 舉個例子,Kubernetes清單文件格式扮演著契約的角色,這個清單提供了所需的來源細節、存儲卷定義、存儲需求等,扮演了強大的DevOps類契約。它讓開發者和運營者了解想要的內容。開發者與運營者之間的關系不再如同之前那樣——開發者被迫只管自己的一攤工作。 一張清單可能會包括應用元數據,加上具體版本的描述性參數,其中可能還有多個清單。也許是一個實例、一個pod清單、一個復制控制器(replication controller)或者一個服務定義,還有組成文件的已知來源位置。任意標簽可能由圖表中所包括的組件來定義。 Butcher表示:「應用開發者在這方面的體驗夠深刻了。一旦出現典型問題,就會說丟過牆去,各管各的,反正有DevOps來負責生產環境中的運行事宜,開發者只負責開發,總有一個切換過程,往往會成為各掃門前雪的後果。」 如果開發者構建容器,會存在一定的水平保證(由抽象層決定):這些容器的運行方式在生產階段與開發階段是一樣的。這已經緩解了讓懂得容器這個基本工具的DevOps專業人員感到頭疼的大多問題。容器化已經提供了這種保障,不過像Helm(Engine Yard所提供的新服務)之類的產品有助於進一步規范化這種關系,具體表現為團隊間的契約形式——團隊成員不能再推卸責任,各掃門前雪了,而要全程參與。 從虛擬機與Monolith,到容器,再到微服務 根據Joyent的CTO Bryan Cantrill的說法:容器為原生雲架構提供了基礎,與傳統的虛擬化形式相比,象徵著一種新的應用架構形式。在使用較大的機器來進行計算時,基於硬體的虛擬化或者傳統虛擬機流行過一段時間。虛擬機為運營團隊提供了管理大型整體應用的方式,就像Cantrill說的「過於臃腫」,而硬體定義了企業架構。虛擬機建議在底層之上,承擔了運營系統的負載。但是容器創建了一個全新而更敏捷的抽象。就是Cantrill的那句話:「應用繼續減肥速成修煉。」 如今,唯一的麻煩在於如何將虛擬機和monolith換成容器和微服務。各家公司還在想方設法執行這種轉變,因為兩種方式對應用架構、基礎設施還有公司自身整體的思路都是迥異的。 Cantrill表示:Joyent的開源Triton服務,其目的就是為了簡化與加速公司向容器與微服務的轉變。它允許開發者簡化架構,只提供容器,不提供虛擬機。由於無需配置中國絡等操作,用戶可以通過閱讀微服務手冊,在短時間內完成部署。 Cantrill表示,Joyent公司是Docker Compose的粉絲,因為Compose可以用來與單獨的Docker Engine通訊。Docker的遠程端點由Triton部署,從而虛擬化了整個數據中心。使用這些工具,很容易快速讓一個完整有彈性的運營服務運轉起來。正如Cantrill所言:「這是大勢所趨。」 VMware的CTO Kit Colbert從如何沿著容器之旅前進的角度來觀察市場。VMware著重運營領域。現在它開發了一種方式,來滿足新的開發人員及其需求,不過是作為基礎架構提供商存在。 對於VMware來說,這家公司將自己視為基礎設施提供商,而不是以應用為中心、面向架構的公司。Colbert只看到了對Cloud Foundry感興趣的消費者,不過也有人想要DIY的方法。VMware正在設法通過vSphere集成容器(VIC)與Photon平台對應用技術提供支持。 為了讓消費者適應使用容器,vSphere集成容器(VIC)讓容器化工作負載稱為vSphere的重中之重。VIC適合在開發進程中運行,將容器化最有價值的一個方面應用在容器中:靈活並具有動態的資源界限。通過虛擬化,VMware將普通硬體轉化為簡單、可取代的財產。同樣,通過在虛擬機中應用Docker端點,vSphere集成容器創建了完全動態邊界的虛擬容器主機。結果就是對傳統與基於微服務應用同樣支持的基礎架構,允許IT與開發者的訪問。 相比之下,VMware的Photon平台是專為原生雲應用設計的。Photon平台由最小的管理程序與控制面板組成,專為微服務提供速度與規模的服務。Photon平台在設計時還考慮到了開發者通過API使用時的易用性,讓這個平台成為一個提供應用程序與快速部署的自助服務平台。 從VMware的角度來說,運營團隊也在推進部署速度。現在更著重於數字化體驗或者軟體如何提供更多功能方面。很類似我們如何看待在智能手機上使用的應用。供應商可能以聲音很大的揚聲器而聞名,不過服務的應用是否能提供功能? Colbert詢問:「我能依賴它嗎?」 公司必須找出構建應用,為尋找高質量應用的消費者提供服務的方式。想要繼續進步,就必須找到這一點。很多擁有外置式、虛擬化基礎架構的消費者希望:隨著應用開發進程的加快,解決公司面臨的挑戰。 在微服務時代的開發 軟體開發是迭代式的,需要持續的反饋循環才能奏效。這也是類似IBM Bluemix Garage Method所提供的工具所提供的功能。不過大多公司是根據模型來執行的,這與開發者工作的方式不同。開發者不會按照銷售、市場推廣、財務等部門人員的方式來工作,開發者不是按照計劃或方案來執行工作的。軟體開發的過程有更多的迭代,並非瀑布式自上而下的。 Pivotal的首席技術Michael Coté表示:「我不知道怎麼說,不過真實世界與軟體世界是完全不同的。」Coté辯稱:找出軟體開發的方式似乎非常矛盾,不過事實上確實阻止了人們想要根據一份文檔來了解一個巨大機器的所有部件的工作方式。通過遵守軟體開發的原則,各家公司找到了自己的辦法,而不是嚴格遵守固定的計劃。 Coté認為,沒有執行微服務的固定道路。用微服務可以在運行中和架構上獲得靈活性。微服務根據簡單的原則構建出真正復雜的東西。原則越簡單,所能創造的東西就越復雜。 不過,如果把復雜性轉移到其他地方會發生什麼?Pivotal這個平台管理著復雜程度。去掉選擇,讓消費者無需考慮中國絡、運營系統等問題。它允許消費者將復雜性放在應用堆棧的頂層,在為終端用戶提供服務時能夠更好的區分服務。Hately表示:「在科技行業,我們看到了另一個文藝復興時期。」 同樣地,IBM Bluemix Garage Method也希望簡化復雜性,以便讓開發者的工作更有效率,能夠更好地享受自己的工作。所有這些努力都為企業提供了巨大的機會,無論在技術還是文化層面
❸ 如何做好前台服務
:一是實證研究;二是徵求客戶的意見,詢問客戶願意與什麼樣的銷售人員打交道;三是讓銷售經理根據自己的經驗談談他們的觀點。本次專題中,戰斗在營銷第一線的銷售經理根據自己的實踐經驗,提出了銷售人員應當具備的各種能力。 著名營銷經理人孫躍武先生提出,今天的銷售人員要具備三個方面的能力,即承壓能力、 分析能力和溝通能力。 1.承壓能力。銷售人員肩上扛著巨大的銷售指標, 身後有主管經理一次接一次的催促,面臨的卻是客戶的冷漠與拒絕。面對困難,一些人感到迷茫和沮喪,或放棄,或消極工作,結果自然是離成功越來越遠。因此,擺正自己的位置、端正自己的心態、面對壓力、承受挑戰是每一名銷售人員,尤其是剛走出校門邁上工作崗位的年輕人應具備的能力。 2.分析能力。銷售人員要具備對市場機會的敏銳分析能力,學會發現市場機會,在與競品的戰斗中脫穎而出。 3.溝通能力。把自己的觀念、信念、方案、方法推銷給上級、下級和客戶是銷售人員最重要的能力之一。而良好的溝通能力是贏得他人支持的最好方法。實踐告訴我們,銷售中的許多問題都是因溝通不暢造成的。 作為一名成功的銷售經理人和培訓師,賈昌榮先生認為銷售人員要具備以下能力:知識能力(了解行業、產品、消費等方面知識)、調研能力(如區域市場考察、評估)、判斷能力(如在設立經銷商時總要優中選優,要具備判斷客戶素質的能力)、表達能力(能把事情說清楚)、推銷能力(如百事銷售人員在為經銷商實施助銷過程中,為批發商拿訂單)、談判能力(如與大賣場沖突談判,以及矛盾化解)、管理能力(如管理經銷商)、服務能力(簡單責任事故處理,如因產品質量引發客戶投訴)、結算能力(如貨款管理、商業信用、財務等)、適應能力(如經常調整銷售區域,銷售員要具備適應力)、進階能力(不斷學習,提升能力)等。 營銷經理人崔自三先生認為,以下五種能力可打造出營銷高手。 1.適應能力。從企業的內部環境來說,營銷人員首先要能夠適應公司,適應公司的企業文化、運營理念、營銷方針、人文環境等。從企業的外部環境來講,營銷人員還應能適應市場的需要、適應經銷商的發展需求、適應當地的風土人情等。銷售人員只有適應了營銷職業、適應了營銷生活、適應了企業的內外部環境,才能更好地給自己准確定位,找到適合自己發展的方向之所在。 2.學習能力。銷售人員要更快地成長,就必須具備學習的能力。包括學習國家的方針政策、相關的經濟法規、國家的宏觀、微觀經濟政策,從「戰略」方面武裝自己。更要學習經營管理學、營銷學、心理學、公關學等知識,完善自己的知識結構,達到從專才、通才到復合型人才的轉變。 3.領悟能力。任何一個具有一定市場營銷實戰經驗的人,都知道「悟性」的重要性。優秀的銷售人員能夠洞察機會,分析問題,從而利用機會,為銷量「錦上添花」;或是把問題變成提升銷量的機會。有的銷售人員面對問題不知所措,讓機會從身邊白白溜走。 4.應變能力。時代和市場永遠在變,銷售人員的思路和方法必須跟著變。 5.創新能力。市場形勢千變萬化,而營銷模式卻日趨雷同,銷售人員要想在市場上立於不敗之地,那就必須具有創新能力,使自己的產品、渠道、思路、策略等能夠個性張揚,脫穎而出。 各位銷售經理從多個角度提出了成為一名優秀銷售人員必須具備的種種能力,由於大家所處行業、企業和個人成長經歷不同,提出的觀點也不同。限於篇幅,不能一一探討。本次專題將重點探討面對今天這樣的市場營銷環境,銷售人員應當具備的核心能力。 專業能力。今天不是一個跑江湖的時代,銷售人員不可能靠「耍嘴皮」贏得生意。銷售人員要具備專業能力,如掌握產品知識、銷售技巧、消費心理、促銷策略、經銷商管理、渠道管理、終端管理、市場運作、談判等方面的知識和能力才能面對市場挑戰,應對自如。 洞察能力。只要你能准確地把握客戶的心理,其實是條條大道通羅馬。 溝通能力。成功始於合作,合作始於信任,信任始於理解,理解始於溝通。 抗逆能力。在銷售的道路上,從來沒有平坦的大道可走。在困難與壓力面前,有的人選擇逃避,有的人選擇應戰。你的前途取決於面對困難與壓力時你所做的選擇。 學習能力。學習者不一定是成功者,但成功者必定是擅長學習者。 總結能力。7年時間從一名業務新手成長為年銷售額達7億元的分公司銷售經理的南風集團華北區經理李勇剛說,銷售人員分為兩種類型:做的和不做的;做的銷售人員又分為兩種:認真做的和應付地做的;認真做的銷售人員又分為兩種:做後總結的和做後沒有總結的。
❹ 如何做一個優秀的微服務訪問安全設計方案
微服務訪問安全設計方案稍等 ,我現在發你。
❺ docker鏡像中的微服務怎麼訪問宿主機上的oracle資料庫呢
在home上安裝一個oracle客戶端,配置好鏈接文件
❻ 什麼是微服務
微(micro)就是指體積小,服務(service)區別於系統,服務於一個或者一組相對較小且獨立的功能單元,是用戶可以感知最小功能集。微服務是一種分布式系統解決方案架構。將單個應用程序作為一組小型服務,每個服務程序都在自己的進程中運行,並與輕量級機制進行通信。服務圍繞業務功能構建。可以通過全自動部署機器獨立部署。可以用不同的編程語言編寫,使用不同的數據存儲技術,並盡量不採用集中式管理。我在黑馬程序員社區學到的,社區有很多學習視頻,路線圖什麼的,感覺對學習編程的小夥伴很有用,想學習的可以看一下。謝謝你對我們的支持,希望我的回答能有所作用,歡迎追問,再次表示感謝!
❼ 微服務只能通過訪問微服務網關來轉發到對應的微服務上,而不能讓客戶端應用通過ip直接訪問微服務
啊是的還不錯的。
❽ 如何在開發時部署和運行前後端分離的JavaWe
在開發中大型的JavaEE項目時,前後端分離的框架逐漸成為業界的主流,傳統的單機部署前後端在同一個項目中的工程項目越來越少。這類JavaWeb項目的後端通常都採用微服務的架構,後端會被分解為諸多個小項目,然後使用bbo+zookeeper或者springCloud來構建微服務,前端則會是一個單獨的項目,前台的請求通過微服務來調用。但是,不同與傳統的web項目,這類前後端分離的項目如何在開發中部署和運行呢?
當前後端分離時,後端項目一定會被載入到tomcat的webapp目錄下面,但是前端的資源院該如何被訪問到呢?這里以tomcat這個中間件為例,探討在開發這類項目的時候,如何讓前後端分離的項目部署並且運行起來,即後端項目部署在tomcat之後如何在運行時訪問靜態資源(非上線部署)。
主要有兩種方案:1.在本地通過Nginx來處理這些靜態資源。2、將靜態資源統一放入一個javaweb應用中,並將自動生成的war包隨後端項目一期丟入tomcat。下面詳細介紹
一、使用Nginx來訪問靜態資源。
在本地安裝nginx並且修改nginx.conf,修改相關配置,將web訪問的埠的資源進行更改,配置如下:
server { listen 80; server_name localhost; charset utf-8; #access_log logs/host.access.log main;
location / { proxy_pass http://tomcat_pool; proxy_redirect off;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
location ~ .*.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css|woff|woff2|ttf|eot|map)$ {
root D:Workspacesesop-html; index index.html;
}
listen對象改為你本地的tomcat訪問埠,最下面location中的root改為你前端項目中靜態資源的位置,這樣就可以實現只部署後端的項目就能訪問前端的頁面了。
二、將前端項目轉換為動態的web項目,隨後端項目一起丟入tomcat
這個方案省去了在本地安裝和配置nginx,但是也只適用於開發階段項目的部署運行和調試,真正在生產環境通常前後端項目會部署在不同的伺服器。
如果是Intellij Idea,在導入前端項目之後,右鍵項目 add framework support --> web application,這時將會把前端項目轉換為一個javaweb項目,然後將靜態資源放在生成的web目錄下即可。
如果是eclipse,可以新建一個javaweb項目然後將靜態資源放入web或者webcontent目錄下,或者直接先導入前端項目,然後通過 project facts 將項目轉換為dynamic web項目並勾選 js等相關配置。
然後,運行項目時把後端的war包和前端的war包一同添加到 deployment中運行即可。
❾ 微服務好處
微服務獨立之後,給了對應的團隊和組織快速迭代和交付的能力,同時,也給團隊和組織帶來了更多的靈活性,實際上,對應交付不同微服務的團隊或者組織來說,現在可以基於不同的計算機語言生態構建這些微服務。
微服務的提供者既可以使用 Java 或者 Go 等靜態語言完成微服務的開發和交付,也可以使用 Python 或者 Ruby 等動態語言完成微服務的開發和交付,對於團隊內部擁有繁榮且有差異的語言文化來說,多語言生態下的微服務開發和交付將可以最大化的發揮團隊和組織內部各成員的優勢。
當然,對於多語言生態下的微服務研發來說,有一點需要注意:為了讓服務的訪問者可以用統一的介面訪問所有這些用不同語言開發和交互的微服務,應該盡量統一微服務的服務介面和協議。
在微服務的生態下,互通性應該是需要重點關注的因素,沒有互通,不但服務的訪問者和用戶無法很好地使用這些微服務,微服務和微服務之間也無法相互信賴和互助,這將大大損耗微服務研發體系帶來的諸多好處,而多語言生態也會變成一種障礙和負累,而不是益處。
❿ 內部微服務系統之間調用是否需要安全認證嗎
想要為開發工程師們開發一個既能滿足REST約束條件和原則又不像OAuth OAuth 那樣復雜 the complexity ,僅僅使用簡單的傳值語句或者其它簡單但同樣安全的方法就能實現的web API? 聰明人會有聰明的想法… 問題 直接通過HTTP literally passing the credentials over HTTP以文本方式傳輸鑒權信息可能會被破譯; 尤其在 Gawker incident, 再以文本或是弱加密的方式傳輸鑒權信息是非常不安全的做法 weakly-hashed anything is usually a bad idea. 即便是使用哈希加密後還是很有可能被人根據彩虹表 Rainbow Table破譯出與用戶名匹配的密碼(個別案例) 這可該怎麼辦,真是郁悶… 也許你又會想到很多公共的API popular public APIs在請求中採用雙數據的模式:一個公有值一個(最好是有)只有屬主能訪問的私有值。 」還是有點不對!」這不跟原來(用戶名密碼模式)文本模式差不多麼,還是可能會被(嗅探器)破譯。 這時候你可能准備放棄並採用OAuth模式了,但仍堅信必有某種簡單方法能實現公用webAPI安全訪問私有鑒權信息。 解決方案 連續2天的Peyote實驗後(你可能會找到更好的放鬆辦法),結論終於呈現在你眼前:Amazon是擁有最大的、使用最多的在線網路API的網路服務之一,並且根本不支持OAuth! 經過一個下午長時間的狂想之後,你最終敗下陣來,並看到Amazon是如何保持API請求安全的。你不清楚為什麼,但讀完整頁關於如何為Amazon網路服務裝配一個請求後,你依然覺得不完全合理。這個「簽名」和什麼連在一起?代碼示例中的「data」參數是什麼?這樣,你會繼續查找關於「安全API設計」的文章。。。 當遇到其他人問同樣的問題時,你看到一些指出"HMAC"或其他事物的優秀回復,但還是不太確定。 你找到其他鼓勵你使用「HMAC」的文章並且你正H-FINE地使用它,如果有人將「HMAC」解釋成簡明的H_ENGLISH的話。 你的確偶遇了一個有道理的蒸餾的基本概念,它是這樣一簡明的英語描述的: 一個伺服器和客戶端知道一個公鑰和一個私鑰;只有伺服器和客戶端知道私鑰,但每個人都知道公鑰。。。但不關心別人所知道的。 一個客戶端生成一個唯一的HMAC(哈希)表示它到伺服器的請求。通過把請求數據(參數和值或XML/JSON或任何它計劃發送的數據)以及請求數據的散列blob和私鑰結合來實現。 客戶端隨後將這個HASH以及所有它將要發送的參數和值一並發給伺服器。 伺服器接到請求,並使用與客戶端相同的方式重新生成自己獨有的基於提交值的HMAC(哈希)。 然後,伺服器比較這兩個HMAC,如果相同,伺服器就信任這個客戶端並執行請求。 這似乎很直截了當。最初讓你困惑的是,你以為原始請求是經過加密傳送的,但實際上,HMAC方法所做的一切只是使用只有客戶端和伺服器才知道的私鑰將參數生成為一些獨特的校驗和(哈希)。 隨後,客戶端將這個校驗和及原始參數和值發給伺服器,然後伺服器復核校驗和(哈希)以確定它接受客戶端所發的請求。 因為根據假設,只有在客戶端和伺服器知道私鑰,我們假設如果他們的哈希匹配,那麼它們會互相信任,以至伺服器隨即正常處理這個請求。 你知道在現實中,這就相當於某人過來對你說:「Jimmy讓我告訴你把錢給Johnny」,但你不知道這個人是誰,所以你要伸出手去試探他,看看他是否知道這個秘密握手。 如果三次握手證明無誤,則通訊繼續進行,否則中斷通訊。. 你明白了大概是怎麼回事,但還是想會不會還有更好的方法呢?還好,有tarsnap網站 tarsnap幫你答疑解惑。看看亞馬遜是如何解決簽名認證問題的Amazon screwed this up with Signature Version 1. 看完了亞馬遜的web service是如何鑒權的,re-read how Amazon Web Services does authentication 講的確實有道理,整個流程如下: [客戶端]在調用REST API之前,首先將待發送消息體打包, combine a bunch of unique data together(websevice端將要接收的數據) [客戶端]用系統分派的密鑰使用哈希(最好是HMAC-SHA1 or SHA256 ) 加密(第一步的數據). [客戶端]向伺服器發送數據: 用戶身份認證信息例如,用戶ID,客戶ID或是其他能別用戶身份的信息。這是公共API,大家都能訪問的到(自然也包括了那些居心叵測的訪問者)系統僅僅需要這部分信息來區分發信人而不考慮可靠與否(當然可以通過HMAC來判斷可靠性). 發送生成的HMAC碼. 發送消息體(屬性名和屬性值),如果是私有信息需要加密,像是(「mode=start&number=4&order=desc」或其他不重要的信息)直接發送即可. (可選項)避免重放攻擊 「replay attacks」 o的唯一辦法就是加上時間戳。在使用HMAC演算法時加入時間戳,這樣系統就能依據一定的條件去驗證是否有重放的請求並拒絕. [伺服器端]接收客戶端發來的消息. [伺服器端] (參看可選項)檢查接收時間和發送時間的間隔是否在允許范圍內(5-15分)以避免重放攻擊replay attacks. 提示: 確保待檢對象的時區無誤daylight savings time 更新: 最近得到的結論就是直接使用UTC時區而無需考慮DST的問題 use UTC time . [伺服器端]使用發送請求中用戶信息(比如.API值)從資料庫檢索出對應的私匙. [伺服器端] 跟客戶端相同,先將消息體打包然後用剛得到的私匙加密(生成HMAC)消息體. (參看可選項) 如果你使用了加入時間戳的方式避免重放攻擊,請確保服務端生成的加密信息中擁有和客戶端相同的時間戳信息以避免中間人攻擊man-in-the-middle attack. [伺服器端] 就像在客戶端一樣,使用HMAC哈希加密剛才的信息體. [伺服器端] 將伺服器端剛生成的哈希與客戶端的對比。如果一致,則通訊繼續;否則,拒絕請求! 提示: 在打包消息體的時候一定要考慮清楚,如果像亞馬遜進行簽名版本1中信息識別那樣會面臨哈希沖突的問題 open yourself up to hash-collisions! (建議:將整個包含URL的請求加密即可!) 特別提示:私匙絕對不能在通訊過程中傳遞,它僅僅用來生成HMAC,伺服器端會自動查詢出它的私匙並重新生成自己的HMAC.我來翻譯公匙僅僅用來區分不同的用戶,即使被破解也無所謂。因為此時的消息無需判斷其可靠性,服務端和客戶端還是要通過私匙來加密(比如,前綴、後綴,倍數等等) 10/13/11更新:Chris最近發現 pointed out 如果在HMAC計算中加入了URI或是HTTP請求/回復,攻擊者更易通過更改末端或是HTTP方法來搞破壞。比如,在HTTP POST方法中將/issue/create改成/user/delete。