1. 程式人生 > >Atlassian JIRA 授權許可證機制分析

Atlassian JIRA 授權許可證機制分析

JIRA在Atlassian開發的各種產品中算是最著名的一個,它主要是用來做產品缺陷跟蹤和專案管理的。JIRA是商業軟體,它的授權是按使用使用者數劃分的,最便宜的10使用者版本只要10美元,這極大地方便了小型團隊的開發,不過25個使用者的授權版本就高達1200美元了。今天來講一講JIRA的軟體許可證是如何授權的。事實上Atlassian的諸多產品例如協作和內容共享應用Confluence、版本控制解決方案Stash等都是採用的類似的授權機制。

從一條Lincense談起

在Atlassian網站上,使用者可以申請JIRA的一個月試用許可證。授權資訊的生成需要使用者提供一個Server ID,它是在安裝完JIRA第一次啟動時由客戶端生成的。隨後便可以得到一個完整的許可證字串:

AAABDg0ODAoPeNptUNtKxDAQfc9XBHyOpKlttZCH2gas9LK0VRF8idlRI91akrS4f293q4iyMAPDn
Msc5uwBtjgDhVmI6VXsRbEf4rTtMKMeQxlYZfTo9MfAb/MmeYqxmGU/ycMGpQaOQyYd8AOfLMUi9
K6NPC+0gsGC2OqjWlSdaDZN3gr068CdmeAPvduPUMkd8LQuS9GkeVKsuFROz7AK+pV7D8YeTBgqp
R4cDHJQID5HbfY/iXxCPcJCVJtXOWi7Hk17PY7a4Q6sW82rafcMpn65s4slJx5qwcxg8oxf06AgN
7TzSZFEAWkuxCNqRcWXJgXzaHQZROg7+0Iv8uwUcjrUZjLqTVr4/74vnyt/nTAsAhR8v6Zm5YfvZ
WVBnwouY7xhT+jwUgIUbRhGVaC8P9JCvDPT1MXIwnCgGqA=X02dp

明眼人一看這顯然是經過Base64編碼的,不過在補齊長度的結尾=後面還有五個字元。其中第一個X是一個固定的分隔符;緊接著的02代表許可證版本,即第二版;最後的dp是長度校驗碼,它是由31進位制轉換而來。dp轉成十進位制就是428,可以看到去掉最後五個字元和所有換行符後,許可證真正的字串長度的確是428。

解碼Base64

以下的內容用Python演示,首先將其解碼。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
>>> license = 'AAABDg0ODAoPeNptUNtKxDAQfc9XBHyOpKlttZCH2gas9LK0VRF8idlRI91akrS4f
293q4iyMAPDnMsc5uwBtjgDhVmI6VXsRbEf4rTtMKMeQxlYZfTo9MfAb/MmeYqxmGU/ycMGpQaOQyYd8 AOfLMUi9K6NPC+0gsGC2OqjWlSdaDZN3gr068CdmeAPvduPUMkd8LQuS9GkeVKsuFROz7AK+pV7D8YeT BgqpR4cDHJQID5HbfY/iXxCPcJCVJtXOWi7Hk17PY7a4Q6sW82rafcMpn65s4slJx5qwcxg8oxf06AgN 7TzSZFEAWkuxCNqRcWXJgXzaHQZROg7+0Iv8uwUcjrUZjLqTVr4/74vnyt/nTAsAhR8v6Zm5YfvZWVBn wouY7xhT+jwUgIUbRhGVaC8P9JCvDPT1MXIwnCgGqA=' >>> len(license) 428 >>> import base64 >>> s = base64.b64decode(license) >>> s '\x00\x00\x01\x0e\r\x0e\x0c\n\x0fx\xdamP\xdbJ\xc40\x10}\xcfW\x04|\x8e\xa4\xa9m\x b5\x90\x87\xda\x06\xac\xf4\xb2\xb4U\x11|\x89\xd9Q#\xddZ\x92\xb4\xb8\x7fow\xab\x8 8\xb20\x03\xc3\x9c\xcb\x1c\xe6\xec\x01\xb68\x03\x85Y\x88\xe9U\xecE\xb1\x1f\xe2\x b4\xed0\xa3\x1eC\x19Xe\xf4\xe8\xf4\xc7\xc0o\xf3&y\x8a\xb1\x98e?\xc9\xc3\x06\xa5\ x06\x8eC&\x1d\xf0\x03\x9f,\xc5"\xf4\xae\x8d</\xb4\x82\xc1\x82\xd8\xea\xa3ZT\x9dh 6M\xde\n\xf4\xeb\xc0\x9d\x99\xe0\x0f\xbd\xdb\x8fP\xc9\x1d\xf0\xb4.K\xd1\xa4yR\xa c\xb8TN\xcf\xb0\n\xfa\x95{\x0f\xc6\x1eL\x18*\xa5\x1e\x1c\x0crP >Gm\xf6?\x89|B=\x c2BT\x9bW9h\xbb\x1eM{=\x8e\xda\xe1\x0e\xac[\xcd\xabi\xf7\x0c\xa6~\xb9\xb3\x8b%\' \x1ej\xc1\xcc`\xf2\x8c_\xd3\xa0 7\xb4\xf3I\x91D\x01i.\xc4#jE\xc5\x97&\x05\xf3ht\ x19D\xe8;\xfbB/\xf2\xec\x14r:\xd4f2\xeaMZ\xf8\xff\xbe/\x9f+\x7f\x9d0,\x02\x14|\x bf\xa6f\xe5\x87\xefeeA\x9f\n.c\xbcaO\xe8\xf0R\x02\x14m\x18FU\xa0\xbc?\xd2B\xbc3\ xd3\xd4\xc5\xc8\xc2p\xa0\x1a\xa0'

解碼出來的內容,由三部分組成。第一部分是前四個位元組,代表著第二部分的長度,因此根據第一部分的值便可以切割出後面兩個部分。

在上面的例子中,一個部分的值是\x00\x00\x01\x0e。JIRA的主要實現語言是Java,這裡的四個位元組是使用DataInput介面中的readInt()方法讀取的。若將四個位元組代表的8位整數分別稱作a, b, c, d,則它表示的整數可以通過如下方法得出:

(((a & 0xff) << 24) | ((b & 0xff) << 16) | ((c & 0xff) << 8) | (d & 0xff))

Java的內部編碼基本遵循UTF-32BE,即將Unicode全部字元用四位元組固定長度編碼,並且位元組序為Big Endian。在Python端,我們可以這樣解碼:

1
2
>>> ord(s[:4].decode('UTF-32BE'))
270

得到了這個長度,便可以將上面的內容分割成兩部分了,稱前一部分為licenseText,後一部分為licenseSig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> licenseText, licenseSig = s[4:4 + 270], s[4 + 270:]
>>> licenseText
'\r\x0e\x0c\n\x0fx\xdamP\xdbJ\xc40\x10}\xcfW\x04|\x8e\xa4\xa9m\xb5\x90\x87\xda\x
06\xac\xf4\xb2\xb4U\x11|\x89\xd9Q#\xddZ\x92\xb4\xb8\x7fow\xab\x88\xb20\x03\xc3\x
9c\xcb\x1c\xe6\xec\x01\xb68\x03\x85Y\x88\xe9U\xecE\xb1\x1f\xe2\xb4\xed0\xa3\x1eC
\x19Xe\xf4\xe8\xf4\xc7\xc0o\xf3&y\x8a\xb1\x98e?\xc9\xc3\x06\xa5\x06\x8eC&\x1d\xf
0\x03\x9f,\xc5"\xf4\xae\x8d</\xb4\x82\xc1\x82\xd8\xea\xa3ZT\x9dh6M\xde\n\xf4\xeb
\xc0\x9d\x99\xe0\x0f\xbd\xdb\x8fP\xc9\x1d\xf0\xb4.K\xd1\xa4yR\xac\xb8TN\xcf\xb0\
n\xfa\x95{\x0f\xc6\x1eL\x18*\xa5\x1e\x1c\x0crP >Gm\xf6?\x89|B=\xc2BT\x9bW9h\xbb\
x1eM{=\x8e\xda\xe1\x0e\xac[\xcd\xabi\xf7\x0c\xa6~\xb9\xb3\x8b%\'\x1ej\xc1\xcc`\x
f2\x8c_\xd3\xa0 7\xb4\xf3I\x91D\x01i.\xc4#jE\xc5\x97&\x05\xf3ht\x19D\xe8;\xfbB/\
xf2\xec\x14r:\xd4f2\xeaMZ\xf8\xff\xbe/\x9f+\x7f\x9d'
>>> licenseSig
'0,\x02\x14|\xbf\xa6f\xe5\x87\xefeeA\x9f\n.c\xbcaO\xe8\xf0R\x02\x14m\x18FU\xa0\x
bc?\xd2B\xbc3\xd3\xd4\xc5\xc8\xc2p\xa0\x1a\xa0'

zlib 解壓縮

licenseText的前五個位元組是一個識別字串,由五個固定的ASCII碼組成。

1
2
>>> map(ord, '\r\x0e\x0c\n\x0f')
[13, 14, 12, 10, 15]

去掉這個字首後的內容是經過zlib壓縮的,我們將其解壓後便得到了原始的許可證內容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>> import zlib
>>> licenseTextOriginal = zlib.decompress(licenseText[5:])
>>> print licenseTextOriginal
#Wed Dec 26 09:17:36 CST 2012
Description=JIRA\: Evaluation
CreationDate=2012-12-27
jira.LicenseEdition=ENTERPRISE
Evaluation=true
jira.LicenseTypeName=COMMERCIAL
jira.active=true
licenseVersion=2
MaintenanceExpiryDate=2013-01-26
Organisation=Clippit Test
jira.NumberOfUsers=-1
ServerID=ABCD-1234-EFGH-5678
SEN=SEN-L2107857
LicenseID=LIDSEN-L2107857
LicenseExpiryDate=2013-01-26
PurchaseDate=2012-12-27

上面的ServerID已被隱去。可以看出這個許可證的內容是非常明確的,在這裡就不多解釋了。

DSA with SHA-1 數字簽名

可以看到上面的各種方法至多可以保證許可證內容的正確性,卻沒有辦法保證鑑別性和不可否認性。JIRA採用了數字簽名的方法來確保軟體許可證的安全,具體而言,便是DSA演算法。

相關推薦

Atlassian JIRA 授權許可證機制分析

JIRA在Atlassian開發的各種產品中算是最著名的一個,它主要是用來做產品缺陷跟蹤和專案管理的。JIRA是商業軟體,它的授權是按使用使用者數劃分的,最便宜的10使用者版本只要10美元,這極大地方便了小型團隊的開發,不過25個使用者的授權版本就高達1200美元了。

linux RCU鎖機制分析

nbsp -i html 都在 而且 content 服務器 單詞 插入 openVswitch(OVS)源代碼之linux RCU鎖機制分析 分類: linux內核 | 標簽: 雲計算,openVswitch,linux內核,RCU鎖機制 | 作者: yuzh

《區塊鏈100問》第57集:股份授權證明機制是什麽?

什麽 tran 取代 ech 中心 工作 pan htm .cn 股份授權證明機制,簡稱DPoS,類似於董事會投票,持幣者投出一定數量的節點,代理他們進行驗證和記賬。為了激勵更多人參與競選,系統會生成少量代幣作為獎勵。比特股、點點幣等數字資產都采用該方式。   DPoS有

HBase多租戶機制分析

了解 同學會 人性 pac 觀察 它的 維度 handle rac   在HBase1.1.0發布之前,HBase同一集群上的用戶、表都是平等的,沒有優劣之分。這種’大同’社會看起來完美,實際上有很多問題。最棘手的主要有這麽兩個,其一是某些業務較其他業務重要,需要在資源有限

Atlassian JIRA Change IP

pre PE query cloud onf written rac start creat Oracle Linux 6.8 Atalssian JIRA 7 原來IP: 192.168.10.200 改新IP: 192.168.12.200 重新跑應用報錯,如下所示:

Mono生命周期函數調用機制分析

不可 依然 .get ret 分析 一個 bubuko IT unity 1.生命周期函數的調用機制是反射,而並非繼承。 我們打開Mono後發現其的確也沒有生命周期函數的實現,向上翻父類中也沒有,好,可以確定其就不是繼承了。 下面驗證下是否是反射,拿void s

memcached內存管理機制分析

BE 實現思路 oid 之前 color 禁止 內存管理機制 abs 才會 memached是高性能分布式內存對象系統,通過在內存中存儲數據對象來減少對磁盤的數據讀取次數,提高服務速度。 從業務需求出發。我們通過一條命令(如set)將一條鍵值對(key,

Linux之poll機制分析

for 可用 報告 超時時間 程序 訪問 events blank linux 應用程序訪問1個設備文件時可用阻塞/非阻塞方式.如果是使用阻塞方式,則直接調用open()、read()、write(),但是在驅動程序層會判斷是否可讀/可寫,如果不可讀/不可寫,則將當前進程休

線程池ThreadPool及Task調度機制分析

do it dequeue sts location object 資料 date async truct 近1年,偶爾發生應用系統啟動時某些操作超時的問題,特別在使用4核心Surface以後。筆記本和臺式機比較少遇到,服務器則基本上沒有遇到過。 這些年,我寫的應用都有一

OSAL工作機制分析

sar 機制 維護 低功耗 nbsp 數據 初始化 如何 oid 協議棧代碼main()函數分析 ZMain文件->ZMain.c->main() 在這裏我們重點了解osal_start_system()函數 int main( void ) { //關閉

kubeadm工作機制分析

介紹 kubeadm一共提供了5個子命令: kubeadm init kubeadm join kubeadm token kubeadm reset kubeadm version 這個可以在k8s v1.5.0 程式碼中cmd/kubeadm/app

atlassian-jira-software-7.5.2 (7.10.2)安裝配置及問題記錄

安裝過程網上資料很多,這裡不再搬磚,只記錄下遇到的問題: 1. 在配置資料庫頁面,測試連線時報錯,嘗試在命令列下登陸,報錯資訊如下: [***@localhost ~]$ mysql -ujira -pjirapasswd ERROR 1045 (28000): Access denied

微擎模組機制分析2

  2017年10月18日 17:51:06 橙虛緣 閱讀數:1626   利用微擎開發些微信公眾號還是非常方便的;模組機制分析主要從其安

區塊鏈100講:EOS通訊機制分析

客戶端和伺服器端的通訊採用RESTful軟體架構風格,伺服器端的每個資源對應一個唯一的URL地址,客戶端將URL地址封裝成http請求傳送到伺服器端,請求對應的資源或者執行相應操作。 1 客戶端傳送訊息流程 以轉賬為例,說明EOS訊息處理流程。通過cleos客戶端發起

android 休眠喚醒機制分析(一) — wake_lock【轉】

Android的休眠喚醒主要基於wake_lock機制,只要系統中存在任一有效的wake_lock,系統就不能進入深度休眠,但可以進行裝置的淺度休眠操作。wake_lock一般在關閉lcd、tp但系統仍然需要正常執行的情況下使用,比如聽歌、傳輸很大的檔案等。本文主要分析driver層wake_lock的實現。

Android IntentService原始碼理解 及 HandlerThread構建訊息迴圈機制分析

  前言:前面寫了Handler的原始碼理解,關於Handler在我們Android開發中是到處能見到的非同步通訊方式。那麼,在Android原生裡,有那些也有到了Handler機制的呢?有很多,比如我們今天所要理解分析的IntentService就使用到了Handler。接下來,我們來深入瞭解一下。   

K8S 原始碼探祕 之 kubelet 同步 Node 狀態(kubelet 心跳機制分析

一、引言        在 K8S 系統執行過程中,kubelet 需要定期向 API Server 上報節點執行狀態(也就是心跳訊息)        本文從原始碼角度分析下 kubelet 進行節點狀態上報

Java代理和動態代理機制分析和應用

一、概述        代理是一種常用的設計模式,其目的就是為其他物件提供一個代理以控制對某個物件的訪問。代理類負責為委託類預處理訊息,過濾訊息並轉發訊息,以及進行訊息被委託類執行後的後續處理。根據代理類的生成時間不同可以將代理分為靜態代理和動態代理兩

影象顯示深入學習三:視窗機制分析

上一篇文章影象顯示深入學習一:Activity啟動過程中介紹了啟動一個Activity在整個Android系統中執行的流程,其中可以看到Window的建立,這篇文章就整理一下Window機制的實現過程吧。 吐個槽,今年大部分時間在公司一直在做SDK專案,UI方面的工作涉及的比較少,現在重

Linux訊號(signal) 機制分析

【摘要】本文分析了Linux核心對於訊號的實現機制和應用層的相關處理。首先介紹了軟中斷訊號的本質及訊號的兩種不同分類方法尤其是不可靠訊號的原理。接著分析了核心對於訊號的處理流程包括訊號的觸發/註冊/執行及登出等。最後介紹了應用層的相關處理,主要包括訊號處理函式的安裝、訊號的傳送、遮蔽阻塞等,最後給了幾個簡單的