向 HSM 发送命令时出现问题
Issue while sending command to HSM
我正在尝试使用 python 代码向 HSM (Thales paysheild 9000) 发送命令。但是我从代码中得到的响应并不符合预期。
Input: HEADJA12345678912306 #generate random pin of length 6
Ouput: HEADJA12315
任何人都可以帮助我确定问题所在吗?理想情况下,响应应该包含 JB 而不是我作为输出获得的 JA。
下面是代码。
#!/usr/bin/python
import socket, binascii, string
from struct import *
import time;
TCP_IP = 'localhost'
TCP_PORT = 6511
COMMAND = 'HEADJA12345678912306'
def testPrintable(str):
return all(c in string.printable for c in str)
def buildCommand(command):
hCommand = ''
i = 0
while True:
if (command[i:i+1] == '<'):
i = i + 1
while True:
hCommand = hCommand + binascii.a2b_hex(command[i:i+2])
i = i + 2
if (command[i:i+1] == '>'):
i = i + 1
break
else:
hCommand = hCommand + command[i]
i = i + 1
if (i == len(command)):
break
return hCommand
def main():
global TCP_IP
global TCP_PORT
global COMMAND
connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connection.connect((TCP_IP, TCP_PORT))
BUFFER_SIZE = 1024
COMMAND = buildCommand(COMMAND)
SIZE=pack('>h',len(COMMAND))
MESSAGE = SIZE + COMMAND
connection.send(MESSAGE)
data = connection.recv(BUFFER_SIZE)
if (testPrintable(MESSAGE[2:])):
print "sent data (ASCII) :", MESSAGE[2:]
print "sent data (HEX) :", MESSAGE.encode('hex')
if (testPrintable(data[2:])):
print "received data (ASCII):", data[2:]
print "received data (HEX) :", data.encode('hex')
connection.close()
if __name__ == "__main__":
main()
问题已解决,我使用的 header 长度不正确。更正 header 长度后,HSM 以正确的消息响应。
HSM 的设计方式是,如果它收到任何不在其列表中的命令,它将不会提供任何正确的输出。这样做是为了提高安全性并防止外部黑客攻击。就像您的情况一样,您对发生的事情一无所知。幸运的是,问题出在 header 长度上。但在某些情况下,这可能是任何其他问题,HSM 不会给出正确的错误代码。
我正在尝试使用 python 代码向 HSM (Thales paysheild 9000) 发送命令。但是我从代码中得到的响应并不符合预期。
Input: HEADJA12345678912306 #generate random pin of length 6
Ouput: HEADJA12315
任何人都可以帮助我确定问题所在吗?理想情况下,响应应该包含 JB 而不是我作为输出获得的 JA。
下面是代码。
#!/usr/bin/python
import socket, binascii, string
from struct import *
import time;
TCP_IP = 'localhost'
TCP_PORT = 6511
COMMAND = 'HEADJA12345678912306'
def testPrintable(str):
return all(c in string.printable for c in str)
def buildCommand(command):
hCommand = ''
i = 0
while True:
if (command[i:i+1] == '<'):
i = i + 1
while True:
hCommand = hCommand + binascii.a2b_hex(command[i:i+2])
i = i + 2
if (command[i:i+1] == '>'):
i = i + 1
break
else:
hCommand = hCommand + command[i]
i = i + 1
if (i == len(command)):
break
return hCommand
def main():
global TCP_IP
global TCP_PORT
global COMMAND
connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connection.connect((TCP_IP, TCP_PORT))
BUFFER_SIZE = 1024
COMMAND = buildCommand(COMMAND)
SIZE=pack('>h',len(COMMAND))
MESSAGE = SIZE + COMMAND
connection.send(MESSAGE)
data = connection.recv(BUFFER_SIZE)
if (testPrintable(MESSAGE[2:])):
print "sent data (ASCII) :", MESSAGE[2:]
print "sent data (HEX) :", MESSAGE.encode('hex')
if (testPrintable(data[2:])):
print "received data (ASCII):", data[2:]
print "received data (HEX) :", data.encode('hex')
connection.close()
if __name__ == "__main__":
main()
问题已解决,我使用的 header 长度不正确。更正 header 长度后,HSM 以正确的消息响应。
HSM 的设计方式是,如果它收到任何不在其列表中的命令,它将不会提供任何正确的输出。这样做是为了提高安全性并防止外部黑客攻击。就像您的情况一样,您对发生的事情一无所知。幸运的是,问题出在 header 长度上。但在某些情况下,这可能是任何其他问题,HSM 不会给出正确的错误代码。