音声データのセキュリティ対策について

722 views
Skip to first unread message

3panda

unread,
Jul 22, 2014, 7:47:53 PM7/22/14
to html5-dev...@googlegroups.com
大変ご無沙汰しております、大阪の城口です。

今回、表題の件で皆様のお知恵をお力をお借り出来ればと思い
投稿させて頂きました。



現在関わっているスマートフォン向けのWebアプリのプロジェクトで
音声再生を行う事となり、
対応ブラウザの関係から※HTML Audio APIを選択する事になりました。
(※対応環境はAndroid OS 2.3以上、ブラウザは標準ブラウザをサポート

今回問題になったのが音声データのセキュリティなのですが
音声データはクライアントからユーザーが直接ダウンロード等を
行えないようにして欲しいとの強い要望があり対策を検討しておりました。

プロジェクト内で色々と試行錯誤した結果、音声データをbase64にエンコードして
対応しようと試みたのですが実機(iPhone Android共に)では
音声の再生がなされず、結果として振り出しに戻ってしまい
途方に暮れております。

今回、音声データの保護が要望としても高いため、対応環境も
見直す事提案出来るのですが、何か他に手段があれば
現状の対応環境のままで行きたいと考えております。

何か良いアドバイスがあれば、よろしくお願い致します。


補足:PCでの再生と実機でもbase64にエンコードしていない音声データでの再生は確認しております。


■対応環境
Android
OS 2.3以上
標準ブラウザ

iOS 6
Safari
Chrome

■音声のファイル形式
AAC

Futomi Hatano

unread,
Jul 22, 2014, 8:51:14 PM7/22/14
to html5-dev...@googlegroups.com
城口さん

羽田野です。この話、オーディオを扱うウェブアプリ開発の受託では、
よく出てくる話ですよね。困ったもんです :)
本当の意味の保護をするなら、Web Cryptography API が実装されるのを
待つ必要があるでしょうね。
http://www.w3.org/TR/WebCryptoAPI/
ただ、鍵の生成、交換、暗号化、復号化など、かなり面倒ですが...
とはいえ、PCならまだしも、スマートフォンではまだ使えないのが痛いですが。

クライアントの要望を見る限りは、本当の意味の保護ではなく、
単にファイル取得を面倒にすれば良いということなんでしょうかね。
(要望というよりかは、妥協してくれたのかもしれませんが...)

Base64 のデータを <audio> の src 属性に直接セットしても、iOS の
Safari では動作しないことは、私も過去に経験しました。

ちょっと面倒なのですが、こちらを試してはいかがでしょう。
<audio> ではなく、Web Audio API を使う方法です。
http://html5doctor.com/taking-web-audio-offline-in-ios-6-safari/

英語なのですが、コードを見れば、なんとなくお分かり頂けると思います。
簡単に言うと、まず、Base64 データを、ArrayBuffer に変換します。
この記事では、その変換に、base64-binary.js というライブラリーを
紹介しています。
https://github.com/danguer/blog-examples/blob/master/js/base64-binary.js

そして、Web Audio API の decodeAudioData() メソッドを使って、
その ArrayBuffer をデコードします。
コールバック関数には、デコードされた AudioBuffer オブジェクトが
第一引数に引き渡されます。
AudioBuffer オブジェクトさえ手に入れば、あとは、自由に Web Audio API
を使って、そのオーディオを料理できるはずです。

私は試したことがないので動くかどうか分かりませんが、ご参考に
なれば幸いです。

羽田野

--
Futomi Hatano
http://www.html5.jp/
http://www.futomi.com/
http://twitter.com/futomi
> --
> このメールは Google グループのグループ「html5j」の登録者に送られています。
> このグループから退会し、グループからのメールの配信を停止するには html5-developer...@googlegroups.com にメールを送信してください。
> このグループに投稿するには、html5-dev...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/html5-developers-jp からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/d/optout にアクセスしてください。


Ken Kikuchi

unread,
Jul 22, 2014, 9:26:37 PM7/22/14
to html5-dev...@googlegroups.com
菊地と申します。

2014年7月23日 9:50 Futomi Hatano <futomi...@gmail.com>:
> ちょっと面倒なのですが、こちらを試してはいかがでしょう。
> <audio> ではなく、Web Audio API を使う方法です。
> http://html5doctor.com/taking-web-audio-offline-in-ios-6-safari/
Web Audio API,すごくいいんですが,今回の城口さんの要件ではかなり厳しいです。

>> ■対応環境
>> Android
>> OS 2.3以上
>> 標準ブラウザ
>>
>> iOS 6
>> Safari
>> Chrome
とのことなのですが,iOSはiOS6以上でOKですが,Androidが全然だめです。
Androidでは,
・標準ブラウザ…Web Audio APIサポートせず
・Chrome…比較的新しいバージョンではブラウザとしてはサポートしている
 ※ただし,実際に使えるかどうかは端末依存
という状況です。
この端末依存というのが
http://jp.techcrunch.com/2013/07/17/20130716chrome-29-beta-brings-webrtc-and-web-audio-api-to-android-omnibox-improvements-vp9-support-to-desktop/
によると,「NEONオプティマイゼーションをサポートするARMデバイスのみ」とい
うことで,最新の機種であっても使えないことがあります。
Xperia Z2やGalaxy S4とかでも非対応でした。
さすがに,Android OS 2.3以上,標準ブラウザっていう条件を満たすのは困難
ではないかと思います。

--
菊地 謙 (Ken Kikuchi)
k...@nuasa.org
http://kikulab.blogspot.jp/

Yohei Munesada

unread,
Jul 22, 2014, 9:56:49 PM7/22/14
to html5-dev...@googlegroups.com
城口さん

初めまして、宗定と申します。
完全にダウンロードを防ぐことは難しいですが、
画像や音声ファイルのダウンロードを難しくするために、以下を行った事があります。

◆URLパスの一部ハッシュ化
Jenkinsビルドでリリースするたびにパスの一部をハッシュ化する事で、外部からのリンクをリンク切れさせたり、他リソースのパスの推測を困難にする。

◆HTTPヘッダの付与
XHRでDLする際に、アプリ固有のHTTPヘッダを付与することで、そのヘッダ無しのリクエストをはじく。

◆ユーザーエージェントのでのリクエスト制限
UAは偽装されやすいですが、UAでのリクエスト制限も有効だと思います。


羽田野さんの提案と組み合わせると、上手く顧客要件を満たせたりしますでしょうか?
参考になれば幸いです。

宗定洋平




2014年7月23日 10:12 Ken Kikuchi <k...@nuasa.org>:

3panda

unread,
Jul 22, 2014, 10:43:17 PM7/22/14
to html5-dev...@googlegroups.com
>羽田野さん
大変、ご無沙汰しております。


>菊地様 宗定様
お初にお目にかかります。
早速のご回答、誠にありがとうございます。


>羽田野さん

><audio> ではなく、Web Audio API を使う方法です。 
ありがとうございます!
こちらの方法、私も試してみてiOS Safari Chromeで動作を
確認致しました。

そもそもの以下の要件では困難な事が明白だったのですが
何かないかと思い、投稿させて頂きました。
>■対応環境
>Android
>OS 2.3以上
>標準ブラウザ

皆様のご回答からも対応環境の見直しWeb Audio APIでの提案を
再度行いたいと思います。

ありがとうございました!

城口


2014年7月23日水曜日 10時56分49秒 UTC+9 YoheiMunesada:
このグループから退会し、グループからのメールの配信を停止するには html5-developers-jp+unsub...@googlegroups.com にメールを送信してください。
このグループに投稿するには、html5-develo...@googlegroups.com にメールを送信してください。

wakasa masao

unread,
Jul 22, 2014, 11:50:05 PM7/22/14
to html5-dev...@googlegroups.com
若狭です。

結論が出てるようでなんですが・・・
JSでゴリゴリやるのもいいですが、特定機種でなぜか再生できない(Androidの魔窟・・)という悲しい事がありそうな気もしつつ・・。
この手のファイルの保護は現状は厳しいので、サーバサイドで処理するなどでというのが多いきもします。

・リファラーをチェックして指定のhtmlからのリクエストからかで制限をかける
簡単に偽装はできますが・・・気休め程度ですが気軽な気分でDLしようとしてあれ?落とせないのか。と認識させることができる。

・実体のURLではなくアプリが発行した擬似URLで音声ファイルをDLさせる
1. JSでサーバからJSONなりの返答で音声アクセス用のURLを発行させる
2. 1で発行させたURLでmp3なり音声ファイルを読み込ませる
3. 1のURLは30秒以内のアクセスなら許可か1度アクセスされたら無効化など制限をかける
これをすることでURLが拡散しても防止することができます。
ワンタイムの場合は何かネットワークの都合でリトライかかるとうまくいかなくなるのでJSでうまく制御はした方が良いとは思います。

何にしてもローカルに一度はダウンロードしてから再生となるので、完璧な防止策は難しいとは思いますので、コストなどの兼ね合いでの妥協点をどこにもっていくかですね。

------------
wakasa masao


2014年7月23日 11:43 3panda <3pa...@gmail.com>:
>>> html5-developer...@googlegroups.com にメールを送信してください。
>>> このグループに投稿するには、html5-dev...@googlegroups.com にメールを送信してください。
>>> http://groups.google.com/group/html5-developers-jp からこのグループにアクセスしてください。
>>> その他のオプションについては、https://groups.google.com/d/optout にアクセスしてください。
>>
>>
> --
> このメールは Google グループのグループ「html5j」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには
> html5-developer...@googlegroups.com にメールを送信してください。
> このグループに投稿するには html5-dev...@googlegroups.com にメールを送信してください。

3panda

unread,
Jul 23, 2014, 3:28:31 AM7/23/14
to html5-dev...@googlegroups.com
若狭さん

コメントありがとうございます。

その後、サーバーサイドのエンジニアと相談しら結果
若狭さんのおっしゃられている方法に近い形(詳細には違うかもですが)に
なるようです。

おっしゃる通り、どうやっても完璧には無理ですので
その辺りは先方にもご理解を頂く事になりそうです。

ではでは

2014年7月23日水曜日 12時50分05秒 UTC+9 wakasa:
>>> html5-developers-jp+unsub...@googlegroups.com にメールを送信してください。
>>> このグループに投稿するには、html5-develo...@googlegroups.com にメールを送信してください。
>>> http://groups.google.com/group/html5-developers-jp からこのグループにアクセスしてください。
>>> その他のオプションについては、https://groups.google.com/d/optout にアクセスしてください。
>>
>>
> --
> このメールは Google グループのグループ「html5j」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには
> html5-developers-jp+unsub...@googlegroups.com にメールを送信してください。

Sangwhan Moon

unread,
Jul 24, 2014, 12:37:15 AM7/24/14
to html5-dev...@googlegroups.com
Ken Kikuchi wrote:
> とのことなのですが,iOSはiOS6以上でOKですが,Androidが全然だめです。
> Androidでは,
> ・標準ブラウザ…Web Audio APIサポートせず
> ・Chrome…比較的新しいバージョンではブラウザとしてはサポートしている
>  ※ただし,実際に使えるかどうかは端末依存
> という状況です。
> この端末依存というのが
> http://jp.techcrunch.com/2013/07/17/20130716chrome-29-beta-brings-webrtc-and-web-audio-api-to-android-omnibox-improvements-vp9-support-to-desktop/
> によると,「NEONオプティマイゼーションをサポートするARMデバイスのみ」とい
> うことで,最新の機種であっても使えないことがあります。

NEON対応機種に限定するとNvidia社のTegra2を使用した場合以外は、対応となり
ます。Android対応ARMv7 SoCの中ではTegra2以外NEON非対応はありません。これ
が問題になるとは思えません。

(第1世代のAndroid端末G1/Magic/HeroはARMv6ですが...今使っている人はいな
いと思います。)

> Xperia Z2やGalaxy S4とかでも非対応でした。

おそらく、これはChromeのバグだと思います。Z2とS4は、NEON対応です。

--
Sangwhan Moon | @sangwhanmoon
"My secret for Japanese is Google translate"

Ken Kikuchi

unread,
Jul 24, 2014, 1:34:43 AM7/24/14
to html5-dev...@googlegroups.com
菊地です。

2014年7月24日 13:36 Sangwhan Moon <sang...@iki.fi>:
>> http://jp.techcrunch.com/2013/07/17/20130716chrome-29-beta-brings-webrtc-and-web-audio-api-to-android-omnibox-improvements-vp9-support-to-desktop/
>> によると,「NEONオプティマイゼーションをサポートするARMデバイスのみ」とい
>> うことで,最新の機種であっても使えないことがあります。
>
>
> NEON対応機種に限定するとNvidia社のTegra2を使用した場合以外は、対応となり ます。Android対応ARMv7
> SoCの中ではTegra2以外NEON非対応はありません。これ が問題になるとは思えません。
AndroidのハードウェアやARMのことは全然くわしくないのですが,確かに今手元にある
Galaxy S2 (SC-02C)のCPU Exynos 4210もNEONには対応しているみたいですね。

ただ,この端末(Android OS 4.0.3)上のChrome 36.0で
window.AudioContext

window.webkitAudioContext
もインスタンスを作成できないんです。
※相当古い端末で申し訳ないですが。

> おそらく、これはChromeのバグだと思います。Z2とS4は、NEON対応です。
ということだと,今後Chromeのバージョンアップに伴って修正される可能性はありそう
ですね。

Ken Kikuchi

unread,
Jul 24, 2014, 2:07:46 AM7/24/14
to html5-dev...@googlegroups.com
菊地です。

2014年7月24日 14:34 Ken Kikuchi <k...@nuasa.org>:
>> NEON対応機種に限定するとNvidia社のTegra2を使用した場合以外は、対応となり ます。Android対応ARMv7
>> SoCの中ではTegra2以外NEON非対応はありません。これ が問題になるとは思えません。
> AndroidのハードウェアやARMのことは全然くわしくないのですが,確かに今手元にある
> Galaxy S2 (SC-02C)のCPU Exynos 4210もNEONには対応しているみたいですね。
>
> ただ,この端末(Android OS 4.0.3)上のChrome 36.0で
> window.AudioContext
> も
> window.webkitAudioContext
> もインスタンスを作成できないんです。
> ※相当古い端末で申し訳ないですが。
先程,こう書いたのですが,ChromeのBTSを見ていたら,
https://code.google.com/p/chromium/issues/detail?id=166003&can=1&q=OS%3AAndroid%20AudioContext&sort=-stars&colspec=ID%20Pri%20Mstone%20ReleaseBlock%20Area%20Feature%20Status%20Owner%20Summary%20Stars
で,Android OS 4.0.x以前では動かないと書かれていました。なので,この端末が
NGなのはあたりまえですね。
すみませんでした。

ただ,Chrome for Android上でWeb Audio APIを使っていると,結構ブラウザごと
落ちてくれることがあり,BTSにもそういうissueがいくつかあがっています。
Reply all
Reply to author
Forward
0 new messages