2016-08-08 3 views
1

Ich versuche, die SRP protocol für eine Server- und Client-App in Android zu implementieren. Ich habe überprüft, dass OpenSSL das SRP-Protokoll unterstützt, aber wie kann ich auf OpenSSL-APIs von der Android App zugreifen? Ist JNI die einzige Möglichkeit, auf die OpenSSL C-APIs zuzugreifen? Gibt es Beispiele, die ich beziehen kann, wie man das OpenSSL für Android baut und die OpenSSL SRP APIs über JNI aufruft.So rufen Sie OpenSSL SRP APIs von der Android App aus auf?

+0

Haben Sie jemals bekommen SRP unter Android arbeiten OpenSSL? Ich mag die Chiffre wegen ihrer Sicherheitseigenschaften. – jww

+0

Ich probiere die Java-Implementierung https://code.google.com/archive/p/srpforjava/downloads aus, da sie sich nicht mit JNI befasst – Harish

Antwort

2

Ich versuche, die SRP protocol

ich SRP wie auch umzusetzen. Stellen Sie sicher, dass Sie die Spezifikation von Thomas Wu oder die Version 6 der IETF-Spezifikation verwenden.


OpenSSL unterstützt SRP-Protokoll, aber wie kann ich auf OpenSSL-APIs aus dem Android App? Ist JNI die einzige Möglichkeit, auf die OpenSSL C-APIs zuzugreifen?

Ja.

Sie könnten auch auf Bouncy Castle für eine Java-Implementierung suchen.


Gibt es Beispiele, die ich finden kann, wie die OpenSSL für Android bauen ...

OpenSSL and Android Auf der OpenSSL-Wiki.

Android trägt eine Kopie von OpenSSL, aber ich bin mir nicht sicher, dass es SRP enthält.


Gibt es Beispiele, die ich beziehen kann ... die OpenSSL SRP-APIs durch JNI nennen.

Nicht das ist mir bekannt. Der nächste, den Sie finden, ist der Quellcode zu s_client, Optionen wie -srpuser <user> und Datenstrukturen wie srp_arg_st und Funktionen wie ssl_srp_verify_param_cb und ssl_give_srp_client_pwd_cb.

Sie können den Quellcode für s_client unter <openssl src dir>/apps/s_client.c finden. Linie 1365 sieht interessant aus (von 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 

Und die srp_arg_st aus der ganzen Linie 475:

/* 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; 

Offensichtlich OpenSSL ist native C und nicht JNI verwenden.


Wie OpenSSL SRP-APIs aufrufen ...?

Auf den höchsten Ebenen, müssen Sie zwei oder drei Dinge in C von ihnen als Ergänzung zu einer Standard TLS Client vom OpenSSL Wiki Denken tun. (Ich bin Seite Schritt Android/JNI Teil).

Zuerst, müssen Sie die SSL_CTX_set_srp_*_callback setzen. Bei den Callbacks fordert die Bibliothek Ihren TLS-Client zur Eingabe von Informationen wie Benutzername und Passwort auf.

Zweite, entfernen Sie alle Nicht-SRP-Chiffre-Suiten. Das bedeutet, Sie nicht verwenden Sie eine Chiffre-Liste wie "HIGH:!aNULL:!MD5:!RC4".

Dritte, Sie verwenden nur SRP Cipher Suites. Ich bin nicht sicher, wie die Verschlüsselungsliste aussehen würde, wenn Sie "HIGH:!aNULL:..." verwenden. Aber man kann mit der Liste der Chiffren der Hand pflücken:

$ 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 

Wenn Sie zum openssl ciphers man page gehen, dann sollten Sie in der Lage sein, auf überqueren SRP-RSA-AES-256-CBC-SHA mit dem Namen in der Chiffre Liste benötigt. Leider fehlen die SRP Cipher Suites.

Sie können jedoch zu ICANNs gehen TLS paramter registry und die Namen erhalten:

  • 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-CBC-EDE-sha → TLS _SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA
  • SRP-3DES-EDE-CBC-SHA → TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA

Also die Zeichenfolge würden Sie für SSL_CTX_set_cipher_list verwenden oder SSL_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"; 
Verwandte Themen