Dalia: Passwortschutz ??

Hallo Forum,

wuerde mich freuen ob Ihr mir da weiter helfen koenntet.

Das Prb.:

Vbscript that reads USERNAME & PASSWORD from a HTML form and verifies it against a database in SQL - cannot be transferred in clear text (this is where we need help).

eine vorgeschlagene Loesung waere:

Nun, das Problem ist ja, dass die Daten noch _vor_ dem Übermitteln kodiert
werden. Verwendet man da kein SSL, ist JavaScript die einzige Möglichkeit
und da jeder den JS-Code ansehen kann (und somit auch Passwörter im JS-Code
sieht), sind die Möglichkeiten auf asymetrische Verfahren beschränkt (da nur
dort der schiffrierte Text nicht mehr mit dem Passwort in der JS-Datei
dekodiert werden kann). Bei synchronen Codern, kann man den Text mit dem Pwd
in der JS wiederherstellen, was ja eine Sicherheitslücke ist... Folge: du
müsstest für eine hohe Sicherheit schon asynchrone Verfahren anwenden und da
ist SSL wohl sogar einfacher, als selber was in JS zu coden. Wenn du jedoch
nur eine mässig gute Schiffrierung aufbauen willst, genügt es, wenn du einen
synchronen Algorithmus anwendest, aber dann könnte es sein, dass einige
schlaue Hacker die JS öffnen und das Passwort rauslesen (aber immer noch
"etwas" schwieriger, als einfach die Datenpackete abzufangen; wobei das
auslesen der JS wohl das kleinste Problem für einen richtigen Hacker ist).
Aber mir kommt da noch eine andere Lösung:
Du kannst synchrone Schiffrierung benutzen, indem du das Passwort in der JS
bei jedem laden änderst (eg. ein Perl oder php Script, dass einfach immer
die Passwörter austauscht). Mit dem Formular übersendest du einfach noch
eine Passwort-ID (damit kann ein Hacker nix anfangen, jedoch dein
Server-Programm weiss dann, mit welchem Passwort das Fomular gecoded worden
ist)...

Beispiel:

<script src="http://.../cgi-bin/getJS.pl"></script>
<form action="...">
   <input type="hidden" name="pwd-id" value="" />
   <input type="password" name="pwd" />
</form>

getJS.pl generiert nun eine JS Datei, welche das Formular codiert und die
Pwd-ID uncodiert in das Formularfeld "pwd-id" einfügt. Wenn das Formular
abgesendet wird, kann dein Server-Programm in der z. B. Datenbank nachsehen,
welches Pwd zum kodieren verwendet wurde und das Formular erfolgreich
dekodieren.

ich wuerde mich ueber Eure Mienung sehr dankbar.

voraus vielen Dank,

Dalia

  1. use Mosche;

    Du kannst synchrone Schiffrierung benutzen, indem du das Passwort in der JS
    bei jedem laden änderst (eg. ein Perl oder php Script, dass einfach immer
    die Passwörter austauscht). Mit dem Formular übersendest du einfach noch
    eine Passwort-ID (damit kann ein Hacker nix anfangen, jedoch dein
    Server-Programm weiss dann, mit welchem Passwort das Fomular gecoded worden
    ist)...

    Beispiel:

    <script src="http://.../cgi-bin/getJS.pl"></script>
    <form action="...">
       <input type="hidden" name="pwd-id" value="" />
       <input type="password" name="pwd" />
    </form>

    getJS.pl generiert nun eine JS Datei, welche das Formular codiert und die
    Pwd-ID uncodiert in das Formularfeld "pwd-id" einfügt. Wenn das Formular
    abgesendet wird, kann dein Server-Programm in der z. B. Datenbank nachsehen,
    welches Pwd zum kodieren verwendet wurde und das Formular erfolgreich
    dekodieren.

    Hier bliebe immer noch die Sicherheitslücke, dass "der Hacker" (*HMPF*) beide Seiten der Verbindung überwacht, also auch dein Javascript sieht.

    use Tschoe qw(Matti);

    1. vielen Dank Euch Beiden!

      Hier bliebe immer noch die Sicherheitslücke, dass "der Hacker" (*HMPF*) beide Seiten der Verbindung überwacht, also auch dein Javascript sieht.

      da hast Recht Javacode ist sichtbar

      Daniel? Deine idee mit hashcode ist mir auch eingefallen und zwar:

      http://www.aspheute.com/artikel/20010330.htm
      ist fast OK nur er speichert als Passwort den hashcode was waere wenn aus der datebank der Passwort gewaehlt wirdt nach dem UserName danach gehasht und fals  = Request.Form("txtPassword") (das auf dem client /side gehasht wirdt ).

      z.B.
      <% @ Language=VBScript %>
       <!-- #include file="serversidesha1.asp"-->
      <%
      bValidationFailed = False
      If Request.ServerVariables("CONTENT_LENGTH") > 0 Then
        strUsername = Trim(Request.Form("txtUsername"))
        strPassword = Trim(Request.Form("txtPassword"))

      Set conn = Server.CreateObject("ADODB.Connection")
        Set rs = Server.CreateObject("ADODB.Recordset")
        strPath = Server.MapPath("logindb.mdb")
        strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath
        conn.Open strConnection

      rs.Open "select * from Logins where Username='" & strUsername & "'", conn

      If not rs.EOF and not rs.BOF then
         ' beliebige Daten aus der Tabelle auslesen...
          if (calcSHA1(rs("Password"))) = strPassword  then
            Session("AccessGranted") = True
            rs.Close
            conn.Close
            Response.Redirect "ok.asp"
            Response.End
         end if
        End if

      Response.AppendToLog " Logon failed: " & strUsername & " " & strPassword
        bValidationFailed = True
      End If
      %>
      <!--#include file="logonform.asp"-->

      gibt mir den Fehlermeldung:
      Microsoft VBScript runtime error '800a000d'

      Type mismatch: 'calcSHA1'

      Vielen Dank,

      Dalia

      1. Hallo

        Daniel? Deine idee mit hashcode ist mir auch eingefallen und zwar:

        ist fast OK nur er speichert als Passwort den hashcode was waere wenn aus der datebank der Passwort gewaehlt wirdt nach dem UserName danach gehasht und fals  = Request.Form("txtPassword") (das auf dem client /side gehasht wirdt ).

        Also wenn ich dich richtig verstehe, siehst Du ein Problem darin, dass das Passwort auf der Serverseite noch mal gehasht wird.
        Die Lösung: In der DB einfach das Passwort 2 mal gehasht speichern.

        Grüße

        Daniel

        PS: Solltest Du auf evt. Rückfragen keine Antwort mehr bekommen, musst Du mailen (und warten). Ich bin nämlich ab Morgen einige Tage nicht mehr zu Hause.

        1. Halihallo Daniel

          Daniel? Deine idee mit hashcode ist mir auch eingefallen und zwar:

          ist fast OK nur er speichert als Passwort den hashcode was waere wenn aus der datebank der Passwort gewaehlt wirdt nach dem UserName danach gehasht und fals  = Request.Form("txtPassword") (das auf dem client /side gehasht wirdt ).
          Also wenn ich dich richtig verstehe, siehst Du ein Problem darin, dass das Passwort auf der Serverseite noch mal gehasht wird.
          Die Lösung: In der DB einfach das Passwort 2 mal gehasht speichern.

          In der DB steht im Feld Passwort auch der hashcode? - Dann kannst du das Serverseitige-Hashing doch einfach weglassen, oder? - Wenn aber in der DB das Passwort im "clear-text" steht, dann kannst du es so lassen, wie du es in deiner Lösung gepostet hast.

          Viele Grüsse

          Philipp

      2. Halihallo Dalia

        Hier bliebe immer noch die Sicherheitslücke, dass "der Hacker" (*HMPF*) beide Seiten der Verbindung überwacht, also auch dein Javascript sieht.

        Dann gleibt wohl nur noch die Lösung über SHA übrig. Es kommt natürlich darauf an, wie gross die Sicherheit sein soll. Da müsstest du den Auftraggeber fragen. Aber die sicherste Lösung dürfte wohl SSL sein, die gefolgt von der etwas schwieriger zu realisierenden Lösung von SHA (schwieriger, da eigenaufwand von Nöten ist, SSL funktioniert sozusagen "automatisch", jedoch muss man das Zertifikat erst in das System einfügen).

        <% @ Language=VBScript %>
        <!-- #include file="serversidesha1.asp"-->
        <%

        gibt mir den Fehlermeldung:
        Microsoft VBScript runtime error '800a000d'

        Type mismatch: 'calcSHA1'

        Könntest du mal den Source von serversidesha1.asp zeigen? - Kann mir so nicht erklären, warum dieser Fehler erscheint.

        Viele Grüsse

        Philipp

      3. probiers mal mit dem:

        <!-- Hiding
        /*      Script by Lefteris Haritou
                http://www.geocities.com/~lef
        */
        var base= new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9","A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z","a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z")

        var z=23;
        var y=28;
        var f= new Array();
        var K= new Array();
        var login=new Array();
        var lgnum=0;
        for (x=0; x<10; x++){
        f[x]=x<<9
        f[x]+=23
        }
        for (x=10; x<36; x++){
        y=y<<1
        v= Math.sqrt(y)
        v = parseInt(v,16)
        v+=5
        f[x]=v
        y++
        }
        for (x=36; x<62; x++){
        z=z<<1
        v= Math.sqrt(z)
        v = parseInt(v,16)
        v+=74
        f[x]=v
        z++
        }

        function inc(){
        iCounter--
        if (iCounter > 0){
        alert('Login / Password Incorrect\n\nPlease try again')
        document.lgform.user.value=""
        document.lgform.passwd.value=""
        lgnum=0
        }
        else
        location.href='denied.html'
        }

        function check(){
        if (lgnum<login.length){
        if (document.lgform.user.value==login[lgnum].usid)
        pwdchk()
        else{
        lgnum++
        check()
        }
        }
        else
        inc()
        }

        function pwdchk(){
        var pass=document.lgform.passwd.value
        var lpass=pass.length
        for (l=0; l<lpass; l++){
        K[l]=pass.charAt(l)
        }
        var code=0;
        for (y=0; y<lpass; y++){
        for(x=0; x<62; x++){
        if (K[y]==base[x])
        code+=(y+1)*f[x]
        }
        }
        if (code==login[lgnum].pwd)
        go()
        else
        inc()
        }

        function go(){
        location.href=document.lgform.passwd.value+'.html'
        }

        function id(usid,pwd){
        this.usid=usid;
        this.pwd=pwd;
        }

        var iCounter=3
        login[0]=new id("050091965",91735)

        //Done Hiding -->

        bei http://www.geocities.com/~lef
        download bar.
        gruss vom alain *derhtaccessbenutz*

  2. Hallo Dalia

    Eine asynkrone Verschlüsselung ist die einzige Sichere Lösung.
    Das sehe ich genau so.

    Dein 2. Lösungsvorschlag ist aber nicht wirklich sicher.
    Der Schlüssel zum codieren der Formulardaten muss ja zum Client übertragen werden.
    Wer in der Lage ist, die Daten mitzuhören, die der Client an den Server schickt, wird sehr warscheinlich auch in der Lage sein, die Antworten des Servers mitzuhören.

    Wenn Du lediglich verhindern willst, dass jemand das Passwort erfährt, wäre es auch möglich, dieses mit einem Hashingalgorithmus zu codieren.
    Damit wird zwar deine Zugangskontrolle nicht sicherer, aber man verhindert immer hin, dass ein Angreifer ein Passwort erfährt, dass möglicherweise auch an anderen Stellen eingesetzt wird.

    Grüße

    Daniel