VBで強固なパスチェックルーチンを組むには?

解決


Delta  2001-03-24 23:31:45  No: 74006  IP: [192.*.*.*]

今、VBでソフトを開発中なのですが、SHWなどに当たり前のパスチェックルーチンが
組めません。(中身が見えてしまうため)
外から解析できないような強固なパスルーチンのいいアイデアはありませんか?
宜しくお願いします。

編集 削除
α  2001-03-25 20:00:33  No: 74007  IP: [192.*.*.*]

パスチェックルーチンって?
もうちょっと詳しく説明して
お願いね

編集 削除
Delta  2001-03-25 22:28:32  No: 74008  IP: [192.*.*.*]

説明不足で申し訳ありません。

シェアウェアなどを試用するとき、パスワードを要求されますよね?
私は、それをフォームにテキストボックスを置いて、そこにパスを入力
してもらうという形で実現しようとしたのですが、その方法だとバイナリーエディタ
で中を覗いて見ると、パスがどこかに見つかるんです。
これは意味がないですよね。

これを、防ぐための方法を探しているのですがなかなか・・・
で、これをパスチェックルーチンと呼ばせてもらいました。

何かアイデアが見つかるとソフトの不正使用は減ると思うのですが・・・

編集 削除
α  2001-03-26 06:54:12  No: 74009  IP: [192.*.*.*]

テキストコントロールなら
 PasswordChar っていうプロパティがあるはずです、が、
それでは意味無いので
Basicで暗号化のプログラムってやりましたか?
例えばキャラクターコードを1つずつずらすとか......
↑の場合で a と入力すると b がでてきます。
KDDと入力すると、LLEになります。
だから、パスワードを QFRTBHJK と仮定します。

ユーザにはそのまま QFRTBHJK と入力すればいいのですが、
フォームは暗号化し、 RGSUCIKL と認識します。
if 変数$="RGSUCIKL" then ******

とすれば、たぶんいいと思いますが。
分からなかったら質問してください。
いつでも答えます。

編集 削除
α  2001-03-26 07:35:34  No: 74010  IP: [192.*.*.*]

必要あればサンプルを作ってみます

編集 削除
Delta  2001-03-26 11:23:08  No: 74011  IP: [192.*.*.*]

すみません、サンプルをお願いできますか?
暗号化のプログラムはまだ組んだことがないので・・・

もう初心者ではないと思ってはいるのですが・・・

編集 削除
PAPY  2001-03-26 13:06:04  No: 74012  IP: [192.*.*.*]

暗号化にはZlibの圧縮(PNG)やPCX_RLE圧縮,TGA_RLE圧縮
Packed_Bits圧縮など画像圧縮20種類ぐらいを施して更に、自分なりの暗号化プログラムを施してやると通常の人には絶対わからないでしょうY(^^)Y

※JPEG圧縮はだめですよ。不可逆式なので暗号が元に戻りません。

編集 削除
α  2001-03-26 14:58:42  No: 74013  IP: [192.*.*.*]

サンプルできました。
このようにすればいいと思います。

Private Sub Command1_Click()

PASS$ = Text1.Text  'パスワードを代入します


For k = 1 To Len(PASS$)

    tpass$ = tpass$ + Chr$(Asc(Mid$(PASS$, k, 1)) + 1) '一文字ずつ取り出し、↓へ
                                                       'キャラクターコードを
Next k                                                 '一つずつずらします


If tpass$ = "RGSUCIKL" Then     'この場合、ユーザはQFRTBHJKと入力した

    MsgBox "パスワード一致"
    Exit Sub
    
End If

'パスワードが一致しなかった処理
MsgBox "パスワードが一致しません"

End

End Sub

結果待ってます。

編集 削除
α  2001-03-26 15:00:38  No: 74014  IP: [192.*.*.*]

サンプルできました。
このようにすればいいと思います。

Private Sub Command1_Click()

PASS$ = Text1.Text  'パスワードを代入します


For k = 1 To Len(PASS$)

    tpass$ = tpass$ + Chr$(Asc(Mid$(PASS$, k, 1)) + 1) '一文字ずつ取り出し、↓へ
                                                       'キャラクターコードを
Next k                                                 '一つずつずらします


If tpass$ = "RGSUCIKL" Then     'この場合、ユーザはQFRTBHJKと入力した

    MsgBox "パスワード一致"
    Exit Sub
    
End If

'パスワードが一致しなかった処理
MsgBox "パスワードが一致しません"

End

End Sub

結果待ってます。

編集 削除
α  2001-03-26 15:01:15  No: 74015  IP: [192.*.*.*]

すいません再送信しちゃいました。
ごめんなさい

編集 削除
α  2001-03-26 15:25:23  No: 74016  IP: [192.*.*.*]

Chr$(Asc(Mid$(PASS$, k, 1)) + 1)
を詳しく解説すると、

・関数
Asc関数は文字のJISコードを返値にします。(A->65,B->66)
Chr$関数はJISコードの文字を返値にします。
要するにAscとChr$は反対の性質を持っています。

・まとめて
Mid$で PASS$ から k 番目の文字を 1 文字取り出す。
その文字をAscで数に変換し、1を足す。
さらにその数字をChr$で文字に直す。

こんなような感じです。
でもこれはBASIC解説書をそのまま
パクったやつですけど・・・(*^_^*)

いろいろ応用して作れるので試してみてください。

編集 削除
Delta  2001-03-26 16:07:58  No: 74017  IP: [192.*.*.*]

ありがとうございます。

いただいたサンプルで試してみたところ、うまくいきました。
バイナリーエディタで覗いてもパスそのものは見つからなかったので。

もしまた何かあったら書かせていただきます。
そのときはよろしくお願いします。

編集 削除
α  2001-03-26 16:51:15  No: 74018  IP: [192.*.*.*]

どうも

編集 削除
たかみちえ  URL  2001-03-30 13:36:52  No: 74019  IP: [192.*.*.*]

あの、もう解決したんでいいんですけど、

  別にシェアウェアとかのをパスワード入力にしないでもいいのでは?

  Windowsフォルダとかに、登録した人だけもらえる、
複製不可能なファイルを置いてもらって、
その内容が作者の意図したとおりに読めなかったら未登録
逆なら登録済み、っていうふうに…。

  えと、実際にシェアウェアを作ったわけじゃないんで、
"理論上は"ですけど…。

編集 削除
α  2001-03-31 11:38:03  No: 74020  IP: [192.*.*.*]

そのようなら、キーというモノをおすすめします。
私はそういうようなモノを使っているのですが、
方法は2つあります。

★方法1

1バイトほどの小さいキーを大量に作る。(1500個ほど)
これを手作りするには苦労するので専用のプログラムを組む。
例えば
*******.key.23
*******.key.26
〜〜〜〜〜〜〜〜〜〜〜〜
*******.key.1200
みたいな感じで作るといいと思います。
但し出現率及びナンバーの増え方は複雑にした方がいいと
思います。
しかし、スキャンディスクや起動時間などが増えます。

★方法2

わかりにくいところにバイナリファイルのなどをおいておく。
これはファイルの数が少なく起動時間などは
節約されますが、コピーされやすいので気をつけて。

以上の方法がよいと私は存じます。
結果待ってます。

編集 削除
α  2001-04-02 16:47:10  No: 74021  IP: [192.*.*.*]

結果待ってます

編集 削除
Delta  2001-04-18 13:53:06  No: 74022  IP: [192.*.*.*]

久々にきたので追加のカキコに気付きませんでした。
すみません。
上記の件ですが、もしよろしければサンプルを組んでいただけませんか?
図々しいお願いで申し訳ありませんが、よろしくお願いいたします。

編集 削除
α夢幻  2001-04-18 16:12:22  No: 74023  IP: [192.*.*.*]

サンプルですか、
これは、とある電卓のプログラムですが、
キーを作るほうは以下のように・・・

h=1
A

  H=H+Y
  if H<>int(H) then H=int(H)
  if H<>int(H) then goto A:
  Y=Y+1
  if H=1.00041E+06 then end
  N$="the calculator 2019."
  N$=N$+trim$(str$(H))
  N$=N$+".key"
  open N$ for append as #1
  close #1

  if H>1000000 then end

  goto A:

そしてこれは読み込むほうです。

SONAR

  H=1
  label1.caption= "キーファイルをチェック中。暫くお待さい...."


  5

  H=H+Y
  X=X+1
  console 2,2
  if PER<>int(X/1415*100) then label2.caption=PER;"%チェック完了"
  if H<>int(H) then H=int(H)
  if H<>int(H) then goto A:
  Y=Y+1
  if H=1.00041E+06 then end
  N$="the calculator 2019 key\the calculator 2019."
  N$=N$+trim$(str$(H))
  N$=N$+".key"
  PER=int(X/1415*100)
  open N$ for input as #1
  close #1

  if H=998992 then cls
  if H=998992 then return

  if N$="the calculator 2019.998992.key" then cls
  if N$="the calculator 2019.998992.key" then return

  goto 5:

  return
そして、open ****** for input as #++++
のところでキーがなかったりしたらエラーが起きます。
エラールーチンを作ってください。

かなりわかりにくいですが、責任を持って質問は受けます。

編集 削除
α無限  2001-04-18 16:15:02  No: 74024  IP: [192.*.*.*]

訂正:

上の文はBASICでできています。
だから、ループのところにDoEventsを
おかないと危険です。

編集 削除
Delta  2001-04-18 16:42:42  No: 74025  IP: [192.*.*.*]

大変申し訳ありませんが、コードの解説をお願いできませんか?
よろしくお願いします。

編集 削除
α''  2001-04-18 18:29:19  No: 74026  IP: [192.*.*.*]

すみません。分かりません。
自分で作ったのに構造がうっとうしくて
すっかり忘れてしまいました。

でも、重要なのは

キーナンバーを増やしながら、文字を組み立て、
その文字にナンバーを足し(&)、出力する。

ということです。あとこのキー数は1415個です。

一応VBのバージョンを作りました。
Private Sub Command1_Click()

5

    On Error GoTo Ero

    DoEvents

    H = H + Y
    X = X + 1

    If PER <> Int(X / 1415 * 100) Then label2.Caption = PER + "%チェック完了"
    If H <> Int(H) Then H = Int(H)
    If H <> Int(H) Then GoTo 5:

    Y = Y + 1

    If H = 1000410# Then End

    N$ = "the calculator 2019 key\the calculator 2019."
    N$ = N$ + Trim$(Str$(H))
    N$ = N$ + ".key"

    PER = Int(X / 1415 * 100)

    Open N$ For Input As #1
    Close #1

    If H = 998992 Then Exit Sub

    If N$ = "the calculator 2019.998992.key" Then Exit Sub

GoTo 5:

Ero:

    If Err.Number = 63 Then
    
        MsgBox "キーに不良を発見"
        MsgBox "At " + N$
        On Error GoTo 0

    End If

End Sub
変だったら教えてください。

編集 削除
Delta  2001-04-19 14:01:21  No: 74027  IP: [192.*.*.*]

どうもありがとうございます。
色々考えて、次回作での採用を考えたいと思います。
また何かあったらよろしくお願いします。

編集 削除
α  2001-04-19 18:00:05  No: 74028  IP: [192.*.*.*]

役に立ってくれるとウレシイです

編集 削除
Delta  2001-04-19 20:41:11  No: 74029  IP: [192.*.*.*]

今動かしてみたんですが、うまくいきませんでした。
上のルーチンって読み込みの部分だけですか?
ホントに図々しいお願いなのですが、キーファイルを作る
サンプルも作っていただけないでしょうか?
よろしくお願いします。

編集 削除
α  2001-04-20 07:54:52  No: 74030  IP: [192.*.*.*]

できた。

Private Sub Command1_Click()
H = 1

A:

DoEvents

H = H + Y

If H <> Int(H) Then H = Int(H)
If H <> Int(H) Then GoTo A:

Y = Y + 1

If H = 1000410# Then End

N$ = "the calculator 2019." 'キー名を構築
N$ = N$ + Trim$(Str$(H))
N$ = N$ + ".key"

Open N$ For Append As #1 '作成
Close #1

If H > 1000000 Then End 'キーナンバーが1000000以上になったら中止

GoTo A:


End Sub
Private Sub Command1_Click()
H = 1

A:

DoEvents

H = H + Y

If H <> Int(H) Then H = Int(H)
If H <> Int(H) Then GoTo A:

Y = Y + 1

If H = 1000410# Then End

N$ = "the calculator 2019." 'キー名を構築
N$ = N$ + Trim$(Str$(H))
N$ = N$ + ".key"

Open N$ For Append As #1 '作成
Close #1

If H > 1000000 Then End 'キーナンバーが1000000以上になったら中止

GoTo A:


End Sub

Hの増幅方法は多種多様です。

編集 削除
α  2001-04-20 07:56:02  No: 74031  IP: [192.*.*.*]

え?二回も送信されてる。

編集 削除
Delta  2001-04-20 15:15:28  No: 74032  IP: [192.*.*.*]

ようやく動かすことができました。
この質問に関わってくれた皆様ホントにありがとうございました。

編集 削除
α  2001-04-20 15:22:28  No: 74033  IP: [192.*.*.*]

α,Deltaさん,たかみちえさん,PAPYさん

編集 削除
α  2001-04-20 15:35:15  No: 74034  IP: [192.*.*.*]

29回も!

編集 削除