Passwortschutz ??
Dalia
- sonstiges
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
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);
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
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.
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
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
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*
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