簡介性資料
What Is OSDP?
開放監視設備協議(OSDP)是安全行業協會(SIA)爲提高訪問控制和安全產品之間的互操作性而開發的訪問控制通信標準。OSDP v2.1.7目前正在成爲美國國家標準協會(ANSI)認可的標準,並且OSDP正在不斷改進以保持行業領先地位。
Benefits of OSDP
與普通的低安全性傳統協議相比,新興的OSDP標準提供:
- 安全性更高
- OSDP比最常見的訪問控制通信協議更安全。
- OSDP安全通道支持高端AES-128加密。
- OSDP持續監控佈線以防範攻擊威脅。
- 高級功能
- 支持先進的智能卡技術應用,包括PKI / FICAM和生物識別技術。
- 支持設備之間的雙向通信。
- OSDP支持高級用戶界面,包括歡迎消息和文本提示。
- OSDP使用2線而不是12線允許多點安裝,監控連接以指示讀卡器故障,以及連接更多現場設備的可擴展性。
- 使用方便
- 視聽用戶反饋機制提供豐富的,以用戶爲中心的訪問控制環境。
- 由於預定義了加密和身份驗證,因此消除了猜測。
- 嵌入式設備的低成本實施。
- 更多互操作性
- 使用OSDP可以實現不同製造商的設備和解決方案之間的通信。
- 該標準適用於外設設備(PD),如讀卡器和連接安全的門及其控制面板(CP)上的其他設備。
- SIA在製造商和InteropFest的常規“plugfest”中推廣標準 - 每年春天在內華達州拉斯維加斯舉行的ISC West展會上舉辦的年度互操作性活動。
- 當TCP / IP,USB或其他常見協議不適合應用程序時,建議使用OSDP規範。
- OSDP規範可擴展到IP環境,OSDP WG正在努力盡快部署基於IP的OSDP。
所有消息,無論來源如何,都共享相同的結構。
字節 |
名稱 |
含義 |
值 |
0 |
SOM |
消息開始 |
0x53 |
1 |
ADDR |
物理地址 |
0x00 - 0x7E (0x7F可配置) |
2 |
LEN_LSB |
數據包長度低字節 |
|
3 |
LEN_MSB |
數據包長度高字節 |
|
4 |
CTRL |
消息控制信息 |
|
|
SEC_BLK_LEN(可選) |
安全控制塊的長度 |
|
|
SEC_BLK_TYPE(可選) |
安全塊類型 |
|
|
SEC_BLK_DATA(可選) |
安全塊數據 |
|
|
DATA(可選) |
數據塊 |
|
|
MAC [0] |
Mac地址 |
|
|
MAC [1] |
|
|
|
MAC [2] |
|
|
|
MAC [3] |
|
|
|
CKSUM / CRC_LSB |
校驗和,或CRC-16低字節 |
|
|
CRC_MSB(可選) |
CRC-16高字節 |
|
通訊流程
初始化加密流程
加密通信流程講解:
OSDP加密通信的流程:採樣對稱加密的方式:使用的是AES128算法加密,AES常見的對稱加密算法。還有非對稱加密算法,如RSA等,還有哈希散列算法,如MD5 SHA256等(注,散列算法不屬於加密算法,主要做數字簽名等,具有不可逆性。
CP 主控設備 PD 子控設備
1) CP在本地生成一個隨機數RND.A(8個字節的隨機數),通過OSDP_CHLG(0x76)命令將RND.A傳遞給PD設備;
2) PD在收到CP的OSDP_CHLG命令後,在本地生成一個隨機數RND.B(8個字節的隨機數);然後根據RND.A、RND.B
SCBK三個值,生成一組加密密鑰組:
S-ENC(數據機密性密鑰) = Enc({0x01,0x82,RND.A[0-5], 0,...共16字節}, SCBK);
S-MAC1(消息認證密鑰1) = Enc({0x01,0x01,RND.A[0-5], 0,...共16字節}, SCBK);
S-MAC2(消息認證密鑰2) = Enc({0x01,0x02,RND.A[0-5], 0,...共16字節}, SCBK);
SERVER-CRYPTOGRAM(服務端密鑰) = Enc(RND.B[0-8] || RND.A[0-8], S-ENC);
CLIENT-CRYPTOGRAM(客服端密鑰) = Enc(RND.A[0-8] || RND.B[0-8], S-ENC);
然後將PD的cUID(客服端的序列號)和RND.B及CLIENT-CRYPTOGRAM通過OSDP_CCRYPT(0x76)命令發送給CP。
3) CP收到PD的序列號、隨機數B及客服端密鑰後,根據RND.A、RND.B和SCBK三個值,同樣生成一組加密密鑰組:
S-ENC(數據機密性密鑰) = Enc({0x01,0x82,RND.A[0-5], 0,...共16字節}, SCBK);
S-MAC1(消息認證密鑰1) = Enc({0x01,0x01,RND.A[0-5], 0,...共16字節}, SCBK);
S-MAC2(消息認證密鑰2) = Enc({0x01,0x02,RND.A[0-5], 0,...共16字節}, SCBK);
SERVER-CRYPTOGRAM(服務端密鑰) = Enc(RND.B[0-8] || RND.A[0-8], S-ENC);
CLIENT-CRYPTOGRAM(客服端密鑰) = Enc(RND.A[0-8] || RND.B[0-8], S-ENC);
然後判斷生成的CLIENT-CRYPTOGRAM(客服端密鑰)與接收的客服端密碼是否相同,若相同則通過OSDP_SCRYPT命
令將CP生成的SERVER-CRYPTOGRAM(服務端密鑰)發送給PD設備。
4) PD接收到CP的服務器密鑰,將其與本地生成的服務器密鑰比較,若相同則通過OSDP_MAC_I命令返回MAC_I
發送給CP設備。MAC_I = Enc(S-MAC1, S-SERVERCRYPTOGRAM, S-MAC2)
5) CP接收到PD是MAC_I(16個字節)數據,將其保存到CP的維護R-MAC中。使用OSDP的加密通信,在會話完成後,
進行數據通信是一定要帶上MAC,這裏的MAC有點像哈希散列的效果,主要用於數據內容的數據摘要,即校驗
數據是否被修改。並且是使用上次是MAC作爲當前MAC計算的依據,保證了數據包的連續性,及若其中一包消
息,則數據通信立即停止。
C-MAC: Command MAC (for packets from CP to PD)
R-MAC: Reply MAC (for packets from PD to CP)
注意:CP和PD分別各自都維護兩個MAC,C-MAC和R-MAC。
在CP中的R-MAC作爲存放PD回覆的R-MAC使用,併爲發送的C-MAC提供加密參數。
C-MAC = Enc(R-MAC, S-MAC1, S-MAC2, DATA, DATA_LEN);
在PD中的C-MAC作爲存放CP請求的C-MAC使用,併爲發送的R-MAC提供加密參數。
R-MAC = Enc(C-MAC, S-MAC1, S-MAC2, DATA, DATA_LEN);
注意:在OSDP中使用加密通信時,加密塊SEC_BLK_DATA[0]的值(0:代表使用SCBK_D加密,1:代表使用自定義SCBK加密)
SEC_BLK_DATA[1]-SEC_BLK_DATA[16]爲加密的SCBK的值;
SEC_BLK_TYPE爲加密的通道類型:
0x11:新建一個會話連接,CP->PD
0x12:回覆新建會話連接,PD->CP
0x13:確認當前會話連接,CP->PD
0x14:回覆確認會話連接,PD->CP (代表會話已完成)
0x15:安全會話消息. 帶上MAC, PAYLOAD不加密,CP->PD
0x16:安全會話消息. 帶上MAC, PAYLOAD不加密,PD->CP
0x17:安全會話消息. 帶上MAC, PAYLOAD加密,CP->PD
0x18:安全會話消息. 帶上MAC, PAYLOAD加密,PD->CP
SEC_BLK_TYPE = 0x17 和 0x18的時候,需要對PAYLOAD數據進行加密,這個加密也是使用AES加密。
在CP中:加密時:ICV = ~R-MAC,解密時:ICV = ~C-MAC
在PD中:加密時:ICV = ~C-MAC,解密時:ICV = ~R-MAC
PAYLOAD的加密:PAYLOAD-ENC = Enc(ICV, S-ENC, DATA, DATA_LEN);
PAYLOAD的解密:PAYLOAD-DEC = Dec(ICV, S-ENC, DATA, DATA_LEN);
由此可知:服務器密鑰和客服端密鑰是在會話期間使用,用於驗證CP和PD之間的連接。S-MAC1 S-MAC2主要用於生成
R-MAC和C-MAC,用於消息摘要檢驗。而S-ENC主要用於PAYLOAD數據加解密使用的。
一些常見術語解釋:
CUID:客戶端唯一標示符(可以理解爲序列號),推薦爲供應商代碼(3),型號(1),版本(1),序列號LSB(3)。
MK:主密鑰,僅在會話初始化期間使用。
SCBK: 安全通道基本密鑰, 僅在會話初始化期間使用。
SCBK = Enc(cUID ||(~cUID),MK)
RND.A[8]:CP生成的8位隨機數。
RND.B[8]:PD生成的8位隨機數。
MAC_I:MAC_I是在安全信道會話期間使用的波動的MAC的初始值。它是通過使用S-MAC1加密在osdp_SCRYPT中接收的服務器密碼來計算的,然後使用S-MAC2加密結果。
MAC_I = ENC((ServerCryptogram, S-MAC1), S-MAC2) //待驗證
填充是必需的,因爲AES-128算法僅在以16字節爲位權的數據塊上運行。
DATA字段的填充:
將字符0x80附加到數據塊,然後繼續附加所需的0x00字符數,以使數據塊的大小可以被塊大小16整除。若原始數據塊的長度剛好可被16整除,如16, 32等,則將去填充擴大一倍,如原本數據塊長度爲16,則填充後是32。
安全通道建立會話示例:
共享SCBK_D密鑰示例=“303132333435363738393A3B3C3D3E3F”
CP生成一個8字節的隨機數:“B0B1B2B3B4B5B6B7”
osdp_CHLG(530013000D03110076B0B1B2B3B4B5B6B73177):
在PD內:
- 生成8個字節的隨機數;本次會話生成“A0A1A2A3A4A5A6A7”
- 生成會話密鑰
o SMAC1 - 5e 86 c6 76 60 3b de e2 d8 be af e1 78 63 73 32
o SMAC2 - 6f da 86 e8 57 77 7e 81 13 20 35 75 82 39 17 2e
o ENC - bf 8d c2 a8 32 9a cb 8c 67 c6 d0 cd 9a 45 16 82
- 生成主機密碼(保留在內存中):26 d3 35 6e 07 76 2d 26 28 01 fc 8e 66 65 a8 91
- 生成卡密碼:fd e5 d2 f4 28 ec 16 31 24 71 ea 3c 02 bd 77 96
對osdp_CHLG的響應是:
53802B000D0312007600068E0000000000A0A1A2A3A4A5A6A7FDE5D2F428EC16312471EA3C02BD7796 F81E
osdp_SCRYPT(53001B000E0313007726D3356E07762D262801FC8E6665A89140B4):
在PD內:
- 驗證主機(26D3356E07762D262801FC8E6665A891)發送的密碼與存儲在內存中的密碼(請參閱osdp_CHLG)
- 生成RMAC。 RMAC是通過SMAC-1加密主機密碼生成的,然後使用SMAC-2對該加密的結果進行加密。對於此示例會話,RMAC的值將爲“b2 a3 00 57 eb 98 ba 22 29 ec 1f 87 56 62 b5 24”
對osdp_SCRYPT的響應是:
53801B000E03140178 B2A30057EB98BA2229EC1F875662B524 6EEB
解析
osdp_CHLG(530013000D03110076B0B1B2B3B4B5B6B73177):
0x53
0x00
0x13 0x00
0x0D // 1101 包含SB(1)、包含校驗(1)、序列號爲01
0x03 //SB長度
0x11 //SCS_11
0x00 //指定SCBK_D密鑰
0x76 // osdp_CHLNG
B0B1B2B3B4B5B6B7 //8位隨機數RND.A
0x31 0x73 //CRC校驗碼
對osdp_CHLG的響應是:
53802B000D0312007600068E0000000000 A0A1A2A3A4A5A6A7 FDE5D2F428EC16312471EA3C02BD7796 F81E
0x53
0x80 //0x00 + 0x80
0x2B 0x00
0x0D // 1101 包含SB(1)、包含校驗(1)、序列號爲01
0x03 //
0x12 //SCS_12
0x00 //指定SCBK_D
0x76 //osdp_CCRYPT
00068E0000000000 //8位cUID
A0A1A2A3A4A5A6A7 //8位隨機數RND.B
FDE5D2F428EC16312471EA3C02BD7796 //16字節客戶端密碼
0xF8 0x1E //校驗碼
osdp_SCRYPT(53001B000E0313007726D3356E07762D262801FC8E6665A89140B4)
0x53
0x00
0x1B 0x00
0x0E //1110 包含SB(1)、包含校驗(1)、序列號爲2(10)
0x03
0x13 //SCS_13
0x00
0x77 // osdp_SCRYPT
26D3356E07762D262801FC8E6665A891 //16位服務器密碼server Cryptogram
0x40 0xB4 //校驗碼
Respon 53801B000E03140178 B2A30057EB98BA2229EC1F875662B524 6EEB
0x53
0x80
0x1B
0x00
0x0E
0x03
0x14
0x01 //密碼覈對正確
0x78 // osdp_RMAC_I
B2A30057EB98BA2229EC1F875662B524 //16位R-MAC
0x6E 0xEB //校驗碼