2012-12-21 4 views
0

파이썬에서 문자열의 ODIN-1을 생성해야합니다. 공식 documentation은 SHA-1을 입력 문자열/식별자에 적용하는 것을 지정합니다. 그러나 다른 작업을 미리 수행해야하는지 확실하지 않습니다. 또한, 최종 출력은 SHA-1 또는 다른 것의 16 진수 다이제스트입니까?파이썬에서 ODIN-1을 생성하는 방법

예. 어떻게이 MAC을 파이썬에서 ODIN-1로 변환 할 수 있습니까? "74e2f543d2ce"

미리 감사드립니다.

>>> '1A'.decode('hex') == '1a'.decode('hex') 
True 

그래서 우리는 주어진 문자열을 변환 할 수 있습니다

답변

1
from hashlib import sha1 

def odin1(mac_addr): 
    """SHA1 hexdigest of hex representaiton of MAC address""" 
    to_hash ''.join([i.decode('hex') for i in mac_addr.split(':')]) 
    return sha1(to_hash).hexdigest() 

>>> odin1('1a:2b:3c:4d:5e:6f') 
'82a53f1222f8781a5063a773231d4a7ee41bdd6f' 

,의이을 분해하면 링크 된 문서 사이의 라인으로 라인을 보자, 내 대답 :

// NOTE: iOS returns MAC Address NOT a string, but a 6-byte array. 

// A human readable MAC Address may be represented as the following: 

@"1a:2b:3c:4d:5e:6f"; 
@"1A2B3C4D5E6F"; 

파이썬에서 (구두점 및 대문자를 둘러싼 모호성을 줄이는)보다 편리한 형식으로 우리에게 보내주십시오.

>>> mac = "1a:2b:3c:4d:5e:6f".split(':') 
>>> hex_mac = [m.decode('hex') for m in mac] 
>>> hex_mac 
['\x1a', '+', '<', 'M', '^', 'o'] 

SHA1 해시 함수에서 동일한 결과를 얻으려면이 목록을 문자열로 처리해야합니다 (바이트 배열을 사용한 경우와 동일).

>>> mac = '1A2B3C4D5E6F' 
>>> hex_chunks = lambda s: [s[i: i+2] for i in range(0, len(s), 2)] 
>>> [m.decode('hex') for m in hex_chunks(mac)] 
['\x1a', '+', '<', 'M', '^', 'o'] 

그래서 제대로 모든 가능한 형태에서 작동 할 수있는 하나의 함수에 대한 입력을 통합하기 위해 우리에게 달려있을 것이다 : 물론

, 우리는 MAC 주소를 이런 식으로받을 수 있습니다. 그럼에도 불구하고, 우리의 기능 중 하나 형태를 취할 수, 최종 결과는 중요한 것입니다 :

>>> sha1(''.join(['\x1a', '+', '<', 'M', '^', 'o'])).hexdigest() 

은 (당신이 게시 된 링크)에 따라 올바른 해시를 생성합니다.

희망 사항은 내 답변을 명확하게하는 데 도움이됩니다.

+0

을 애플이 명시 적으로 UDID를 대체 할 MAC 기반으로 아무것도 사용하지 않는 사람들에게 것을 언급하고, ODIN은 UDID를 대체 할 하찮게는 MAC 기반으로 뭔가하지 않기 틀렸다. (이것은 분명히 가능하다. 이것은 산업 표준화위원회 또는 다른 어떤 것으로도 고안된 완전히 생각한 스펙처럼 보이지 않는다.) 그들은 분명히 "씨앗은 운영 체제가 반환 한 형식으로 변경되지 않은 채로 두어야한다. 시스템 ","iOS는 MAC 주소를 문자열이 아니라 6 바이트 배열로 반환합니다. "그리고"원시 바이트 배열로 나타내는 것은 구두점과 대문자를 둘러싼 모호성을 방지합니다 ". – abarnert

+1

나는 링크에 게시 된 예제로 곧바로 갔고 단단하게 유지했습니다. 입력이 다를 경우 어떻게 MAC 주소를 소비해야합니까? OP까지 입력을 표준화하는 업무를 맡겠습니다. 그들은 내 스 니펫을 취하여 자신의 필요에 맞출 수 있습니다. 그들은 아마도'hashlib' 호출에 대한 도움이 필요할 것입니다. – Droogans

+0

"입력이 다를 경우 어떻게 MAC 주소를 소비해야합니까?"라는 의미는 무엇입니까? iOS에서 6 바이트 원시 바이트 배열을 가져옵니다. 그 원시 바이트 배열을 SHA1에 정확히 전달합니다. 이것이 바로 문서가하는 말이며, 이것이 어떻게 문제인지는 알 수 없습니다. – abarnert

1

파이썬에서 문자열의 ODIN-1을 생성해야합니다.

아니요, 문서에 따라 다르지 않습니다.

802.11 MAC 주소, ANDROID_ID 또는 DeviceUniqueID의 ODIN-1을 생성합니다. 관련 인용문 :

시드는 운영 체제에서 반환 한 형식에서 변경되지 않아야합니다.

참고 :. 아이폰 OS는 원시 바이트 배열로 나타내는 ... MAC은하지 문자열,하지만 지금 차트 아래에 6 바이트의 배열을 "주소

을 반환 구두점 및 대문자 주위에 모호성을 방지 :

그리고 IIRC는 ANDROID_ID는 MAC이나 문자열도 64 비트 정수입니다. (나는 윈도우 폰에 대한 DeviceUniqueId을 모른다.)

그래서, 당신은 아마도 ODIN-1의를 생성해야 6 바이트 배열 [0x74, 0xe2, 0xf5, 0x43, 0xd2, 0xce] 12 자 문자열 "74e2f543d2ce".이 샘플에서는 Objective-C에서이를 수행하는 방법을 보여줍니다.

mac = bytes([0x74, 0xe2, 0xf5, 0x43, 0xd2, 0xce]) 

또는 귀하의 질문에 어떤 형식으로, 아마도 당신이 전혀 MAC 주소를 원하지 않는, 안드로이드를 지정하기 때문에 ...하지만 난 당신이 그냥 잘못된 태그이었다 가정하고 있습니다 : 파이썬, 그것은이다 iOS를 사용하고 있고 을 수행하면 MAC 주소가이됩니다.

어떻게하면됩니까?

해시 단계 : SHA-1 해시 기능을 통해 식별자 시드를 전달합니다.

는 파이썬에서, 그건 :

hash = hashlib.sha1(mac) 

결과 메시지 다이제스트는 ODIN-1입니다.

파이썬에서, 그건 :

digest = hash.hexdigest() 

것은 함께 퍼팅 :

hashlib.sha1(bytes([0x74, 0xe2, 0xf5, 0x43, 0xd2, 0xce])).hexdigest() 

결과하면 문서가 그것이 있어야의 말과 같이 "40 소문자 문자열"입니다 :

'10f4ab0775380aceaca5a2733604efa6d6364b08' 

또한, 프리 스크립 션에 대한 설명을 찾고 있다면 wary 페이지에 게시 된 nary spec은 왜 그 페이지에 코멘트를 게시하는 대신에 그것에 대해 물어볼 것입니까? 내가 미리에 다른 작업을 수행 할 필요가 있는지 확실하지 않습니다

:

귀하의 첫 번째 특정 질문에 대답하려면?

사양은 말한다 :

씨가 운영 체제에 의해 반환 된 형식에서 변경되지 않은 남아 있어야합니다.

대답하려면 두 번째 :

또한, 최종 출력이 진수 SHA-1의 다이제스트 또는 뭔가 다른 무엇입니까?

사양 말한다 :

결과 메시지 다이제스트 ODIN-1이다.

는 //이 해시의 형식은 40 소문자 문자열이어야한다 :

한편,이 프로젝트에 첨부 된 샘플 코드 (예상대로는 googlecode에서의 주어진) ...하지만 그건 그다지 도움이되지 않습니다.

iOS sample에는 관련 코드가 완전히 누락되었습니다. 마법사에 의해 생성 된 일반 GUI 응용 프로그램이며 #import "ODIN.h"textView.text = [ODIN1() lowercaseString];viewDidLoad에 추가되었습니다. 하지만 그 파일은 ODIN.h이고 해당 파일은 ODIN.m 또는 libODIN.a이거나 어디에도없는 것으로 보입니다. (project.pbxproj의 간단한 글에서 분명히 확인하지 못한 파일이 분명히 있음을 알 수 있습니다.)

Android sample에는 관련 코드가 있지만 사양을 분명히 위반합니다. ANDROID_ID을 유니 코드 문자열로 얻은 다음 을 iso-8859-1으로 인코딩하고 결과 바이트에서 SHA-1을 호출하고 그 중 16 진 다이제스트를 생성합니다. 문서는 명시 적으로 OS가 반환 한 OS 값을 사용한다고 명시합니다. 대신 Latin-1 코드가이를 인코딩합니다.

반면에 Windows sample은 문서가 말하는 것을 수행하는 것 같습니다. DeviceUniqueId를 byte[]으로 가져 와서 그대로 사용합니다. (그러나 코드는 실제로 작동하지 않습니다. 사용하지 않는 API 호출을 사용하기 때문에 byte[]을 반환하지 않고 예외를 throw합니다.)

이 시점에서 필자는 왜이 사양을 따르고 있는지 묻습니다. 첫 번째 장소. 다른 사람의 코드와 상호 운용하려는 경우 디자이너가 의도 한 코드를 추측하기보다는이 코드를 사용하여이 스펙을 해석하는 모순 된 방법을 사용하는 것이 좋습니다. 이 맞으면

... 워드 프로세서를

+0

누구든지 왜 하향 투표했는지, 이유를 설명해 주시겠습니까? – abarnert

+0

나는 그렇지 않았다. 나는 당신의 대답을 읽었는데, 그것은 나의 반응에서 글로 쓰여진 세부 사항에 약간의 빛을 비추었다. 내가 다시 돌려 줄께. – Droogans

+0

@Droogans : 나는 downvoting의 당신을 비난하지 않는다; 나는 누가 그것을했는지 전혀 모른다. 그것이 SO가 작동하는 방식입니다. 누군가가 그렇게했는지 묻기 때문에 답변을 적절하게 개선 할 수 있습니다. – abarnert