4

Webサービスにデータを送信してデータベースに保存するAndroidプロジェクトに取り組んでいます。HTTPプロトコルを使用してWebサービスに接続しています。データ形式にJSONを使用する。

これらのデータとこれらのデータのハッシュ(SHA256)をWebサービスに送信します。

データをデータベースに保存する前に、HASHを使用して、送信したもの(データ)がWebサービスが受信したものと等しいかどうかを確認します。そうでない場合は、エラーメッセージを送信します。

HASHの値が異なる場合があり、エラーメッセージが表示され、データベースにデータが保存されません。

だから私の質問:送信操作中にデータが変更されていないかどうかを確認する別の方法はありますか?

4

7 に答える 7

13

データの変更を非常によく検出しているため、ハッシュはシナリオで機能しているようです。

ただし、ハッシュはデータと共に変更される可能性があるため、これは悪意のある攻撃者に対するセキュリティ対策ではありません。セキュリティに関心がある場合は、 WS-Securityに興味があるかもしれません。

基本的に、暗号化されたチャネル (HTTPS) を使用するか、メッセージに署名する必要があります。

于 2013-01-07T09:26:04.797 に答える
3

チャネルを信頼しない場合は、HTTPS を使用する必要があります。それで全部です。独自の整合性検証メカニズムを構築しようとすることは、独自のセキュリティ プロトコルを設計しようとすることであり、それは最も避けたいことです。

いずれにせよ、使用しているキーなしハッシュ (SHA256 など) では不十分です。メッセージを変更できる敵対者は、変更されたテキストのハッシュを再計算し、それをメッセージと一緒に送信することもできます。より強力なプリミティブが必要になります: MAC (メッセージ認証コード) http://en.wikipedia.org/wiki/Message_authentication_code

HTTPS はこれ以上のものを提供します。

于 2013-01-16T08:39:10.507 に答える
2

Hashing techniquesここでは最良の選択でしょう。

HmacSHA1やなどの任意のハッシュ アルゴリズムを使用できますMD5

Postまたはを使用してデータをサーバーに渡す場合Get、まず、任意のハッシュ アルゴリズムを使用してデータからトークンを作成します。(以下のデータを HMAC SHA1 に変換する関数を参照してください)

このデータを渡すときに、トークンもサーバーに渡します。サーバーは、クライアントが使用したものと同じハッシュ アルゴリズムも使用し、サーバーはリクエストで渡されたデータからトークンを作成します。

その後、サーバーは、生成されたトークンとリクエストで渡されたトークンを照合します。

両方のトークンが一致する場合、リクエストで渡されるデータは改ざんされていません。それ以外の場合、データは改ざんされています。

次の方法を使用して、データのトークンを作成できます。

    /**
     * Encrypts the data passed to it using Hmac-SHA1.
     * 
     * @param dataToEncrypt
     *            data that is to be encrypted.
     * @return The token that is generated after encrypting data.
     */
    public static String convertDataToHmacSHA1(final String dataToEncrypt) {
        String returnString;
        try {
            // Get an hmac_sha1 key from the raw key bytes
            final byte[] keyBytes = HMAC_SHA1_KEY.getBytes();
            final SecretKeySpec signingKey = new SecretKeySpec(keyBytes,
                    "HmacSHA1");

            // Get an hmac_sha1 Mac instance and initialize with the signing key
            final Mac mac = Mac.getInstance("HmacSHA1");
            mac.init(signingKey);

            // Compute the hmac on input data bytes
            final byte[] rawHmac = mac.doFinal(dataToEncrypt.getBytes());

            final StringBuffer stringBuffer = new StringBuffer();
            for (byte b : rawHmac) {
                stringBuffer.append(String.format("%02x", b));
            }
            returnString = stringBuffer.toString();
            Log.e("Token", returnString);
            return returnString;
        } catch (Exception e) {
            Log.e(TAG, "" + e);
        }
        return returnString;
    }
于 2013-01-16T09:53:18.673 に答える
1

現在、ハッシュを使用してデータの整合性を検証しています。両端でまったく同じハッシュを使用していると仮定すると、これは破損したデータを取得することを意味します。

データの破損を検出するだけでなく、エラー訂正コードでデータをエンコードして、受信側で元のデータが破損した場合でも、受信側で元のデータを再構築できるようにすることができます。

この質問への回答でそのようなライブラリを見つけることができます-Java:ECC(エラー訂正コード)ライブラリ?

于 2013-01-07T09:30:18.373 に答える
1

私が間違っている場合は訂正してください。ただし、2 つのことのいずれかを検出するためにハッシュしています。

  1. 「中間者攻撃」を検知する。(MITM)詳しくはこちらをご覧ください
  2. 信頼できないネットワークを検出します。

@Samuel Edwin Ward@radaiは、上記の 2 つについて話していました。

どちらの懸念にも、データを明示的にハッシュする必要のない、かなり優れた既存のソリューションがあります。

まず、MITM 攻撃の可能性を減らすために、HTTPSを使用します。クライアントは、ある程度の自信を持ってサーバーの ID を確立できます。また、盗聴を防ぐのにも非常に優れています。

次に、信頼性の低いネットワークに関する懸念に対処するには、TCP ...を使用します。

TCP は、あるコンピュータ上のプログラムから別のコンピュータ上の別のプログラムへのオクテット ストリームの信頼性の高い、順序付けられた配信を提供します。ウィキペディア

特別なこと (UDP ネットワークの使用など) は行っておらず、Web サービスは既に TCP を使用していると思います。

ハッシュ比較で発生している問題は、アプリケーション ロジックの誤った仮定が原因である可能性があります。間違ったもののハッシュを比較していることをお勧めします。

頭に浮かぶ多くの例の 1 つとして、一部の Web サーバーは、処理中に HTTP 要求に何かを追加します。たとえば、これがプロキシの仕組みです。これにより、デバイスによって送信された HTTP 要求のハッシュと、Web サーバーによって最終的に受信された HTTP 要求のハッシュを比較すると、異なる結果が得られます。

私が提供したインライン リンクを読んで、データの破損に関する懸念が既存のソリューションによってほぼ解決されていることを確認することをお勧めします。そうでない場合は、少なくとも、データをハッシュする必要があると感じる理由をよりよく理解できます。:)

于 2013-01-16T08:21:12.517 に答える
1

あなたの方法は良い方法だと思います。

あなたは3つのステップで重い解決策を持っています:ステップ1:データをアンドロイドに送信するステップ2:アンドロイドはデータを受信し、ウェブサーバーに何を取得したかを通知しますステップ3:サーバーはすべてのフィールドをチェックし、orverallが正しいかどうかをAndroidに通知します.

しかし、この解決策はほとんどの場合重すぎると思います。別の解決策があるかどうかの質問に答えることが目的でした。

于 2013-01-07T09:44:21.797 に答える
1

一度ハッシュしてハッシュを比較するだけではない場合は、データを読み返す必要がありますか。

ハッシュが間違っている頻度にもよりますが、エラー メッセージが表示される前に、アプリケーションに 5 回試みさせてハッシュを正しく取得させることができます。

md5、ripe、crc などの他のアルゴリズムを試しましたか? 多分それらはより効率的です。

小さな文字列の私の経験では、crc を使用しますが、ログインの詳細については、sha256 または sha512 を使用し、パスワードをハッシュしてハッシュを比較するだけです。そうすれば、データベースにパスワードが保存されていません。

お役に立てれば!

于 2013-01-12T16:16:28.270 に答える