C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[18]: 正確な日時を取得するには


(過去ログ 80 を表示中)

[トピック内 35 記事 (1 - 20 表示)]  << 0 | 1 >>

■47239 / inTopicNo.1)  正確な日時を取得するには
  
□投稿者/ hs (185回)-(2010/02/22(Mon) 20:15:41)

分類:[設計/仕様] 

いつもお世話になっております。
設計上どのようにすれば良いのか分からないことがあります。

現在、開発中のアプリケーションにライセンス機能を実現しようと思っております。
ライセンス情報には有効期限を設ける予定なのですが、正確な日時をどのように取得すれば良いのか困っております。

アプリケーションを使用できる条件としてインターネット接続を必須として、クライアントPC以外の日時を取得できればと考えております。もちろんこれは、クライアントPCの日時を手動で変更が可能なため、この日時では完全な有効期限を取得することが出来ないためなのですが、ネットワーク上から日時を取得する方法はないものでしょうか?

分かる方、若しくは他の考え方があればご教授ください。
よろしくお願いします。
引用返信 編集キー/
■47240 / inTopicNo.2)  Re[1]: 正確な日時を取得するには
□投稿者/ れい (881回)-(2010/02/22(Mon) 20:34:00)
No47239 (hs さん) に返信
> いつもお世話になっております。
> 設計上どのようにすれば良いのか分からないことがあります。
>
> 現在、開発中のアプリケーションにライセンス機能を実現しようと思っております。
> ライセンス情報には有効期限を設ける予定なのですが、正確な日時をどのように取得すれば良いのか困っております。
>
> アプリケーションを使用できる条件としてインターネット接続を必須として、クライアントPC以外の日時を取得できればと考えております。もちろんこれは、クライアントPCの日時を手動で変更が可能なため、この日時では完全な有効期限を取得することが出来ないためなのですが、ネットワーク上から日時を取得する方法はないものでしょうか?
>
> 分かる方、若しくは他の考え方があればご教授ください。
> よろしくお願いします。

NTPでとったりHTTPでとったりすればよいかと。

NTPはセキュアじゃないですが、ms程度のオーダーで正確。
HTTPはセキュアにできるけど、sec程度のオーダーくらいまでしか正確ではありません。

引用返信 編集キー/
■47241 / inTopicNo.3)  Re[2]: 正確な日時を取得するには
□投稿者/ こくぶん (47回)-(2010/02/22(Mon) 21:10:54)
# 雑談気味

> NTPでとったりHTTPでとったりすればよいかと。

NTP サーバを偽装されたら元も子もないですね。 :p


あと、ネットにつながる=なんでも出来るワケではない事にも注意が必要かと。
例えば Outbound が TCP 80/443 しか許可されていない様なネットワークだと、 NTP は使えないです。


まぁ、認証で必要とする程度(年月日位?)であれば、 HTTP(S) 辺りで期限情報を送信するサーバを用意してそこにつなぐ、
位でいいかとは思います。

# ちなみに、 HTTP(S) にしたところで偽装は可能なので(以下略
引用返信 編集キー/
■47247 / inTopicNo.4)  Re[1]: 正確な日時を取得するには
□投稿者/ Azulean (534回)-(2010/02/23(Tue) 07:33:48)
No47239 (hs さん) に返信
> アプリケーションを使用できる条件としてインターネット接続を必須として、クライアントPC以外の日時を取得できればと考えております。
> もちろんこれは、クライアントPCの日時を手動で変更が可能なため、この日時では完全な有効期限を取得することが出来ないためなのですが、
> ネットワーク上から日時を取得する方法はないものでしょうか?

「正確な日付をネットワークを介して得ること」ができるのであれば、独自に用意したサーバーに対して「現在利用できるか」を問い合わせることもできそうな気がします。

# そういったインフラを用意できないというケースかどうか分からないので、とりあえず書きました。
引用返信 編集キー/
■47248 / inTopicNo.5)  Re[2]: 正確な日時を取得するには
□投稿者/ 774RR (468回)-(2010/02/23(Tue) 08:52:28)
クライアントが http/https を発信でき、ライセンス元サーバに接続できるという条件下であるのならば、
自社(ライセンス元)鯖にライセンスの有効無効を問い合わせるだけでよくて、
クライアント PC の日付の改竄を心配する必要はない (そんなの無駄)

パスワードプロテクトつきプロキシ経由でアクセスできるようにしておく必要はあるし
プロキシ/NAT 経由であってもクライアントを識別できる機構は必要。

引用返信 編集キー/
■47251 / inTopicNo.6)  Re[3]: 正確な日時を取得するには
□投稿者/ aetos (238回)-(2010/02/23(Tue) 10:20:16)
No47241 (こくぶん さん) に返信

> # ちなみに、 HTTP(S) にしたところで偽装は可能なので(以下略

S でもできるんだっけ。
引用返信 編集キー/
■47255 / inTopicNo.7)  Re[4]: 正確な日時を取得するには
□投稿者/ こくぶん (48回)-(2010/02/23(Tue) 10:42:08)
No47251 (aetos さん) に返信
> ■No47241 (こくぶん さん) に返信
>
>># ちなみに、 HTTP(S) にしたところで偽装は可能なので(以下略
>
> S でもできるんだっけ。

偽装というか、 hosts とか DNS をごにょごにょすれば接続先を任意に出来ちゃうので。
その場合は HTTPS だろうとなりすまし自体は可能だと思います。

但し、証明書の問題が残るので、本当に偽装出来るかは微妙ですね。

# ちゃんとした証明書を使って検証されていれば偽装はムリか。。。
引用返信 編集キー/
■47256 / inTopicNo.8)  Re[3]: 正確な日時を取得するには
□投稿者/ 774RR (469回)-(2010/02/23(Tue) 10:42:58)
https は2つの機能をもっているので、偽装は事実上出来ない。
・通信を開始する時点で、通信先が正しい相手であることを保証すること
・第三者が通信データを傍受しても、解読できないこと

サーバー証明書の運用が正しくないとか、
クライアント(ユーザー)がオレオレ証明書の警告を無視したとか、
まったくの新技術が開発されて現行の暗号システムが破られるとか
そういうことがあれば別。

http はそういう機構一切ないので偽装可能
引用返信 編集キー/
■47260 / inTopicNo.9)  Re[4]: 正確な日時を取得するには
□投稿者/ こくぶん (49回)-(2010/02/23(Tue) 11:08:43)
No47256 (774RR さん) に返信
> https は2つの機能をもっているので、偽装は事実上出来ない。
> ・通信を開始する時点で、通信先が正しい相手であることを保証すること
> ・第三者が通信データを傍受しても、解読できないこと

ですね。
ひとつめの機能のことが頭からすっぽり抜けてました。。。

# ところで、自前で CA 作って該当ドメインの証明書を自作したらどうなるんだろう。。。
# 誰か教えて、偉い人(ぉ

引用返信 編集キー/
■47263 / inTopicNo.10)  Re[5]: 正確な日時を取得するには
□投稿者/ .SHO (1213回)-(2010/02/23(Tue) 11:59:03)
No47260 (こくぶん さん) に返信

> # ところで、自前で CA 作って該当ドメインの証明書を自作したらどうなるんだろう。。。
> # 誰か教えて、偉い人(ぉ

それをオレオレ証明書って言います。
ルート証明書がない(違う)からバレます。
っていうか、該当ドメインの証明書は作れない。

引用返信 編集キー/
■47264 / inTopicNo.11)  Re[5]: 正確な日時を取得するには
□投稿者/ 774RR (470回)-(2010/02/23(Tue) 12:01:18)
・攻撃者はオレオレ認証局を作っただけ(オレオレ認証局+オレオレ証明書だけがある)
・被攻撃者はオレオレ認証局について一切知らず WebUA にこれを追加していない
・公的証明機関はオレオレ認証局を認めてくれていない
状況であるなら、そのオレオレ認証局が勝手に信頼されることはないので問題ないっす。

ユーザーがだまされて WebUA の設定を変更した、つまり
[あなたが信頼する証明機関]にオレオレ認証局を追加したり
[あなたが信頼する発行元]にオレオレ証明書を追加したり
したのであれば、また話は別だけど

# なぜに WindowsUpdate で「証明書の更新」は追加の更新どまりなんだろう・・・
引用返信 編集キー/
■47265 / inTopicNo.12)  Re[5]: 正確な日時を取得するには
□投稿者/ aetos (239回)-(2010/02/23(Tue) 12:14:02)
No47260 (こくぶん さん) に返信

> # ところで、自前で CA 作って該当ドメインの証明書を自作したらどうなるんだろう。。。
> # 誰か教えて、偉い人(ぉ

# 脱線気味ですが…

正当な証明書とは、証明書チェーンをたどって行ったときにルート証明書にたどり着くものを言います。
ルート証明書の正当性は技術的には担保されておらず、OS やブラウザベンダーの判断で収録されます。
今回のケースでは、OS が持っているルート証明書を使うことも、自分でアプリ専用のルート証明書を作ってしまうこともできます。
いわゆるオレオレ証明書でも、限定目的ならば構わないわけです。
前者の場合はお金がかかりますが、後者の場合は無料です(ただし、鍵の管理は厳重にする必要があります)。

以下ほぼ余談。

ところで、アプリが証明書を検証する際には、「正当な証明書とは何か」をアプリが知っていなければなりません。
OS のルート証明書を使う場合は、判断の根拠をアプリの外部に求めることができますが、自己証明書の場合はアプリ内で判断しなければなりません。
この判断基準をどうにかして差し替えられて(クラックされて)しまうと、不正な証明書を信じ込まされてしまうかもしれません。
そのため、OS の証明書を使った方が少しは安全な気がします。

まぁ、それを言ってしまうと、コストを度外視すればクラックできないアプリはないわけで、攻撃者がどこまでコストをかけてクラックしたいかという問題になります。
ライセンス認証というのは比較的攻撃のターゲットになりやすい部分だとは思いますが、失礼ながら、作ろうとしているアプリがどれだけ人気を博すかによります。
耐攻撃性を高めるのにもコストがかかりますので、とにかく高ければいいというものではありません。
ソフトの認知度次第では、防御のためにかけたコストがまるっきり無駄になる可能性も低くはありません。

また、クラックポイントとしては証明書を差し替えるよりも、
・検証結果を無視して検証成功ロジックに誘導してしまう
・そもそも通信自体を回避して検証成功ロジックに誘導してしまう
といったものも考えられるし、その方が楽なので、あまり敏感になる必要はない気がします。
引用返信 編集キー/
■47266 / inTopicNo.13)  Re[5]: 正確な日時を取得するには
□投稿者/ aetos (240回)-(2010/02/23(Tue) 12:16:56)
No47260 (こくぶん さん) に返信

> # ところで、自前で CA 作って該当ドメインの証明書を自作したらどうなるんだろう。。。
> # 誰か教えて、偉い人(ぉ

あ、これって、CA 作るのは自分(=アプリ作者)ですか? それとも他人(=悪意を持った攻撃者)ですか?
引用返信 編集キー/
■47267 / inTopicNo.14)  Re[6]: 正確な日時を取得するには
□投稿者/ なちゃ (401回)-(2010/02/23(Tue) 12:45:49)
元の話題からいってユーザの悪さを防ぐ目的ですから、
例えばユーザが勝手にルート証明書でも入れたらもう防げませんね。
まあ、といってもこれは証明書の検証だけで判断した場合ですが。
引用返信 編集キー/
■47269 / inTopicNo.15)  Re[6]: 正確な日時を取得するには
□投稿者/ こくぶん (50回)-(2010/02/23(Tue) 13:15:20)
> 774RR さん、 aetos さん

余談にお付き合いいただきありがとうございました。
大体理解できました。。。

とりあえず HTTPS で偽装は出来ないと考えてよいってことで。


No47266 (aetos さん) に返信
> ■No47260 (こくぶん さん) に返信
>
>># ところで、自前で CA 作って該当ドメインの証明書を自作したらどうなるんだろう。。。
>># 誰か教えて、偉い人(ぉ
>
> あ、これって、CA 作るのは自分(=アプリ作者)ですか? それとも他人(=悪意を持った攻撃者)ですか?

今回の場合は、「アプリを使う人(=ライセンスを偽装したい人<その言い方はどうかと思う)」を想定してました。

引用返信 編集キー/
■47270 / inTopicNo.16)  Re[7]: 正確な日時を取得するには
□投稿者/ れい (882回)-(2010/02/23(Tue) 16:01:35)
No47269 (こくぶん さん) に返信
>>774RR さん、 aetos さん
>
> 余談にお付き合いいただきありがとうございました。
> 大体理解できました。。。
>
> とりあえず HTTPS で偽装は出来ないと考えてよいってことで。

ユーザーが認証サーバーを誤魔化す可能性を議論しているので、
それに「偽装」という言葉を使うと話が通じなくなりますよね。

HTTPSの話をしているときに「偽装」という単語を使ったら、
普通はサーバー側に悪意が介入する方を指しますよね。
SSLは証明書を持っている側の偽装を防ぐ技術ですから。

なので、

> 今回の場合は、「アプリを使う人(=ライセンスを偽装したい人<その言い方はどうかと思う)」を想定してました。

ここで「偽装」を使うのもmiss leadingだと思います。

結局、皆の認識は殆ど同じですよね。初めから。

・コストさえかければクライアントのクラックは絶対にできる。
・サーバー側にHTTPSを使ってもルート証明書の追加と、DNS書き換え+偽サーバーやパケット書き換えをされれば効果がない。


No47239 (hs さん) に返信
> 分かる方、若しくは他の考え方があればご教授ください。

結局、ユーザーのPCは100%ユーザーの管理下にあるので、
どのソフトがどう動くのか、理論上ユーザーが完全に管理できるんですよね。

もしソフト制作者側だけが管理できるようなコードやプロセス、振る舞いがあるなら、
絶対に止められないウィルスとかが作れてしまうことになります。

Webアプリならユーザーの管理下にコードがないので100%管理できますよ。
常にネットにつながってる、という条件があるので簡単でしょう。
引用返信 編集キー/
■47272 / inTopicNo.17)  Re[7]: 正確な日時を取得するには
□投稿者/ 774RR (471回)-(2010/02/23(Tue) 16:35:54)
要約されてしまった。御意なり。
ユーザーの手元にバイナリがあるのであれば、逆コンパイルしって認証ルーチンをスキップさせる等もできる。

以前にも違うサイトでQ&Aしたけど、結局のところこの手のプロテクトは
かける側とはずす側のコストパフォーマンス問題に過ぎない。

俺の意見としては「やるだけ無駄」「そんなくだらないことにコストをかけるぐらいなら他の品質上げろ」だね

引用返信 編集キー/
■47273 / inTopicNo.18)  Re[7]: 正確な日時を取得するには
□投稿者/ hs (187回)-(2010/02/23(Tue) 17:04:30)
今回のアプリケーションはライセンスの有効期限をユーザーのPCと比較する場合、PC日付を操作することで有効期限を操作されるのを防止したいと考えています。

たまぁに体験版のソフトでは有効期限が切れるとライセンス(購入)が必要になるものがあります。
ライセンスを購入するまでもないソフトの使用期限が切れてしまい、また使いたい時などPCの日付を操作するとそのまま使えてしまうものを見かけます。 このような事さえ防げればと考えています。

ちなみに今回もVB2008で開発なのですが、
イメージとしては以下になります。

ライセンス情報を格納したDBはクライアントPCに保管するものとし、そのDBから有効期限を取得

cn.Open
SELECT 有効期限 FROM T_License WHERE ○○○
cn.Close

'Dim dt As DateTime = Now 'これだとユーザーの操作が可能になるので×
Dim dt As DateTime = ネットワーク上から取得した現在日時を取得したい。

If dt < 有効期限 Then
 MsgBox("有効期限が切れています。")
 Appliaction.Exit
End If

というイメージです。
dtを取得するのは、簡単ではないのでしょうか?
引用返信 編集キー/
■47274 / inTopicNo.19)  Re[8]: 正確な日時を取得するには
□投稿者/ みきぬ (805回)-(2010/02/23(Tue) 17:31:26)
No47273 (hs さん) に返信
> ライセンス情報を格納したDBはクライアントPCに保管するものとし、そのDBから有効期限を取得
>
クライアント側に置いたものは、ユーザによって書き換えられる可能性があります。
バイナリすら安全ではないというのに、DBが安全という理由がどこにあろうか(反語)
引用返信 編集キー/
■47275 / inTopicNo.20)  Re[8]: 正確な日時を取得するには
 
□投稿者/ .SHO (1214回)-(2010/02/23(Tue) 17:42:31)
No47273 (hs さん) に返信

> dtを取得するのは、簡単ではないのでしょうか?

自分で鯖立ち上げればいいいじゃん。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -