2016-08-08 21 views
1

Androidのサーバーおよびクライアントアプリケーション用にSRP protocolを実装しようとしています。私はOpenSSLがSRPプロトコルをサポートしていることを確認しましたが、AndroidアプリからOpenSSL APIにどのようにアクセスできますか? JNIはOpenSSL C APIにアクセスする唯一の方法ですか? Android用OpenSSLの構築方法と、JNI経由でOpenSSL SRP APIを呼び出す方法については、サンプルがありますか?AndroidアプリからOpenSSL SRP APIを呼び出す方法は?

+0

あなたは今までSRPは、OpenSSLを使用してAndroidの下で働いて得ましたか。私は本当にセキュリティプロパティのために暗号が好きです。 – jww

+0

JNIを扱っていないので、私はJavaの実装https://code.google.com/archive/p/srpforjava/downloadsを試しています。 – Harish

答えて

2

私はあまりにも、SRPを好きSRP protocol

を実装しようとしています。 Thomas Wuの仕様、またはIETFの仕様のバージョン6を必ず使用してください。


OpenSSLは、SRPプロトコルをサポートしていますが、どのように私はAndroidアプリからのOpenSSL APIにアクセスすることができますか? JNIはOpenSSL C APIにアクセスする唯一の方法ですか?

はい。

Java実装のためにBouncy Castleを参照することもできます。


私は、AndroidのためにOpenSSLを構築する方法を参照することができます任意のサンプル...

はあるのOpenSSLウィキにOpenSSL and Androidを参照してください。

AndroidはOpenSSLのコピーを持ち歩いていますが、SRPが含まれているかどうかはわかりません。


私が参照できる任意のサンプル... JNI経由のOpenSSL SRP APIを呼び出すためにはあります。

私は認識していません。最も近いのはs_clientのソースコード、-srpuser <user>のようなオプション、srp_arg_stのようなデータ構造、そしてssl_srp_verify_param_cbssl_give_srp_client_pwd_cbのような機能です。

s_clientのソースコードは<openssl src dir>/apps/s_client.cにあります。ライン1365は、(1.0.2hから)面白そうだ:

# ifndef OPENSSL_NO_SRP 
    if (srp_arg.srplogin) { 
     if (!srp_lateuser && !SSL_CTX_set_srp_username(ctx, srp_arg.srplogin)) { 
      BIO_printf(bio_err, "Unable to set SRP username\n"); 
      goto end; 
     } 
     srp_arg.msg = c_msg; 
     srp_arg.debug = c_debug; 
     SSL_CTX_set_srp_cb_arg(ctx, &srp_arg); 
     SSL_CTX_set_srp_client_pwd_callback(ctx, ssl_give_srp_client_pwd_cb); 
     SSL_CTX_set_srp_strength(ctx, srp_arg.strength); 
     if (c_msg || c_debug || srp_arg.amp == 0) 
      SSL_CTX_set_srp_verify_param_callback(ctx, 
                ssl_srp_verify_param_cb); 
    } 
# endif 

そしてライン475周りからsrp_arg_st

/* This is a context that we pass to all callbacks */ 
typedef struct srp_arg_st { 
    char *srppassin; 
    char *srplogin; 
    int msg;     /* copy from c_msg */ 
    int debug;     /* copy from c_debug */ 
    int amp;     /* allow more groups */ 
    int strength /* minimal size for N */ ; 
} SRP_ARG; 

を明らかに、OpenSSLはネイティブCで、JNIを使​​用していません。 OpenSSL SRP APIを呼び出す方法


...?

OpenSSL wikiの標準TLS Clientの補足として、Cで2〜3つのことを行う必要があります。 (私はAndroid/JNIの部分を踏んでいます)。

最初にに設定する場合は、SSL_CTX_set_srp_*_callbackを設定する必要があります。コールバックは、ライブラリがユーザ名とパスワードのような情報をTLSクライアントに要求する方法です。

第2の SRP以外のすべての暗号スイートを削除します。つまり、はありませんは、"HIGH:!aNULL:!MD5:!RC4"のような暗号リストを使用します。

第3のは、SRP暗号スイートのみを使用します。 "HIGH:!aNULL:..."を使用したときに暗号リストがどのように見えるかわかりません。あなたがopenssl ciphers man pageに行くなら、あなたは暗号リストに必要な名前で参照SRP-RSA-AES-256-CBC-SHAを横断することができるはず

$ openssl ciphers -v | grep SRP | grep -v DSS | cut -f 1 -d ' ' 
SRP-RSA-AES-256-CBC-SHA 
SRP-AES-256-CBC-SHA 
SRP-RSA-AES-128-CBC-SHA 
SRP-AES-128-CBC-SHA 
SRP-RSA-3DES-EDE-CBC-SHA 
SRP-3DES-EDE-CBC-SHA 

:しかし、あなたが暗号のリストを選ぶ渡すことができます。残念ながら、SRP暗号スイートはありません。

ただし、ICANNのTLS paramter registryに移動して、名前を取得することができます:

  • SRP-RSA-AES-256-CBC-SHA→TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA
  • SRP-AES-256-CBC-SHA→TLS_SRP_SHA_WITH_AES_256_CBC_SHA
  • SRP-RSA-AES-128-CBC-SHA→TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA
  • SRP-AES-128-CBC-SHA→TLS_SRP_SHA_WITH_AES_128_CBC_SHA
  • SRP-RSA-3DES-EDE-CBC-SHA→TLS

_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA

  • SRP-3DES-EDE-CBC-SHA→TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHAだから文字列は、あなたはSSL_CTX_set_cipher_listSSL_set_cipher_listのために使用します。

    static const char const PREFERRED_CIPHERS[] = 
        "TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA:TLS_SRP_SHA_WITH_AES_256_CBC_SHA: 
        TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA:TLS_SRP_SHA_WITH_AES_128_CBC_SHA: 
        TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA:TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA"; 
    
  • 関連する問題