2016-10-05 8 views
2

ウェブサービスを使用するには、Authorizationという名前のヘッダーの値を生成する必要があります。次のようにヘッダを生成するための手順は次のとおりです。SHA 256を使用したハッシングとAESを使用した暗号化

1. Hash Generation 

    HashValue = SHA2(username, password, id) 

2. Auth Key Generation 

    Authkey = AES(Salt + anotherId + "=" + HashValue) 

これらは、アルゴリズムの詳細です:

Algorithm - AES 
Mode - ECB 
Padding - PKCS5Padding 
Secret key - someString 

は今、私は上記の詳細と、文字列である秘密鍵を使用してAES暗号化を実行します。

暗号化の後、私は上記の暗号化された値をheaderとして使用し、残りのサービスを呼び出します。

私はこれまでのところ、これを行っている:

String username = "username"; 
String password = "password"; 
String id = "123456"; 

String toBeHashed = username + password + id; 
MessageDigest sha256 = MessageDigest.getInstance("SHA-256"); 
byte[] hashed = sha256.digest(toBeHashed.getBytes("UTF-8")); 

String hashString = "=" + Base64.encodeBase64String(hashed); 
System.out.println(hashString); 

String salt = "salt"; 
String anotherId = "123"; 
byte[] forAuth = (salt + orgId + hashString).getBytes("UTF-8"); 

//Mocked "secret key". Original key string is of size 16 bytes. 
byte[] secKey = "secret key".getBytes("UTF-8"); 

SecretKey secretKey = new SecretKeySpec(secKey, 0, secKey.length, "AES"); 

Cipher aesCipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
aesCipher.init(Cipher.ENCRYPT_MODE, secretKey); 

byte[] authorizationKey = aesCipher.doFinal(forAuth); 

System.out.println("-------------------"); 
System.out.println("-------------------"); 
System.out.println(Base64.encodeBase64String(authorizationKey)); 

をしかし、まだバックエンドサービスは、私の認証キーが無効であることを述べています。私が何かを逃しているかどうか教えてください。

+0

AESキーは、長さが16,24、または32バイトなので、AESキーは原則として無効です。プロバイダーがこのような無効なキーを期待どおりに解釈しない可能性があります。 –

+0

実際に私はここに秘密鍵を嘲笑している。元のキー文字列をバイトに変換して長さを取得しようとすると、それは16です。だから、それは問題ではないと思います。私はこの問題を編集します。 – v1shnu

+0

(SHA-2は長さが異なります。2.エンコーディングはどのようにして行われますか?)Webサービスのドキュメント。不一致です(ハッシュ関数は正確に1つの入力を持ち、ブロック暗号は正確に2つの入力を持っています)。単にコードの例やより良い文書を要求してください。 –

答えて

-1

あなたはこれを変更する必要があります:

String hashString = "=" + Base64.encodeBase64String(hashed); 
System.out.println(hashString); 

へ:

String hashString = "=" + new String(hashed); 
System.out.println(hashString); 

ハッシュされたキーは、認証キー生成の前にbase64encodedなっているので。

+0

これを試してみてください。まだ同じエラー – v1shnu

+0

'hashed 'はバイナリデータを含む' byte [] 'です。非文字列データで 'new String(byte [])'を呼び出すことは絶対にしないでください!!! – Robert

+0

@ロバートなぜそれがお勧めできないのか教えていただけますか?ちょうど知りたいと思った.. – v1shnu

関連する問題