ソース:
訳:
この件について誰かがすでに発表していないか探していたところ、 スコット・パイパーによる研究を見つけました。
https://summitroute.com/blog/2018/06/20/aws_security_credential_formats
と、エイダン・スティール。
具体的には、エイダンはどうすればよいかを見つけようとしていた account_id
内でエンコードされます aws_access_key_id
: 例えば、 ASIAY34FZKBOKMUTVV7A
アカウントIDをエンコードする方法 "609629065308"
エイダンさんは、ほぼ正解だったが、いくつかの特殊なケースでは間違えたと書いている。
Aidan は正しい解決策に非常に近づいたと思いますが、ほんの少しの調整 (以下を参照 😃) が必要なだけです。
・最初の 4 文字 ( ASIA
この例では) は実際に文書化されたプレフィックスであり、キーのタイプに依存します。
・文字列の残りの部分 (通常は 16 バイトの長さ) は Base32 でエンコードされます。を参照してください。
これにより、80 ビットのデータ、つまり 10 バイトが得られます。
・アカウント ID は 5 バイト以内に収まりますが、データは 1 ビットシフトされます。 (エイダンの元の計算を 少し 歪めています。かなり意図した冗談です)
import base64
import binascii
def AWSAccount_from_AWSKeyID(AWSKeyID):
trimmed_AWSKeyID = AWSKeyID[4:] #remove KeyID prefix
x = base64.b32decode(trimmed_AWSKeyID) #base32 decode
y = x[0:6]
z = int.from_bytes(y, byteorder='big', signed=False)
mask = int.from_bytes(binascii.unhexlify(b'7fffffffff80'), byteorder='big', signed=False)
e = (z & mask)>>7
return (e)
print ("account id:" + "{:012d}".format(AWSAccount_from_AWSKeyID("ASIAQNZGKIQY56JQ7WML")))
残された疑問と今後の道のり
- 残りのデータ ビット内に何がエンコードされるか (エンコードされる場合)
aws_access_key_id
- スクリプトを試してみて、エッジケースに遭遇した場合はフィードバックを送っていただければ幸いです
ほなほな。