Hej, jag har testat att använda "SHA1Managed"-klassen och kommit fram till att den returnerar olika resultat beroende på vilken text-encoding man använder. Detta gäller främst vid användandet av svenska tecken. Detta gör att en .NET SHA1 skiljer sig från tex. PHP.s SHA1-metod. Hej, Tack för ditt svar! Kör med basic64 encodning, det kör de flesta. Sedan får du tala om för de som ev vill göra en checksum att det är en base 64 string. dom flesta hashfunktioner arbetar direkt på bitnivå och bryr sej inte om vad dom står för.. Fredrik, Tack för alla svar...! :)Olika resultat med SHA1 och encodings
Jag har gjort följande tester med strängen "hej världen".
Här är resultatet av olika encoders.
Använder .NET SHA1Managed-klassen och UTF8-encoding
BE68C1DF883EAF767C7339C0A6ACC04E432D2896
Använder .NET SHA1Managed-klassen och ASCII-encoding
26A73A7DF538D38D9DCF35170484185EBE79B52C
Använder .NET SHA1Managed-klassen och Unicode-encoding
0A5CFEC29562CB6325AC9307FA0A2D689DBCB0F8
Använder .NET SHA1Managed-klassen och "Default"-encoding
19CB538E8F34C13E2745617DAAF86EBD092D5D73
Använder "System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile"
BE68C1DF883EAF767C7339C0A6ACC04E432D2896 (Samam som UTF8)
Använder PHP-metoden "SHA1"
19CB538E8F34C13E2745617DAAF86EBD092D5D73 (Samma som "Default")
"Encoding.Default" använder "Codepage 1252" (Latin1: http://www.microsoft.com/typography...name=%20&fsize=)
Så min fråga är: Vilken kodning ska jag använda?
Vad säger SHA1-standarden om text-encoding, vilken ska egentligen användas?
Enligt PHPs SHA1 så använder dem den implementation som anges i SHA1-RFC.n, vilket i så fall .NETs "HashPasswordForStoringinConfigFile" inte gör då den använder sig av UTF8.
Tack på förhand!
/FredrikSv: Olika resultat med SHA1 och encodings
SHA1 arbetar med meddelandet som skall hashas och det hashade resultatet som bit-arrayer.
Jag vet inte om det finns någon standard för hur man skall omvandla bit-arrayen till sträng.
Det som borde vara samma för alla implementationer av sha1 är alltså att resultatet (i bit-array) skall vara samma när input (i bit-array) är samma.
Det viktigaste i detta sammanhanget är att du använder samma encoding när du hashar värdet för lagring och när du hashar ett värde för att jämföra med ett tidigare hashat värde. Men tyvärr känner jag inte till någon officiell rekommendation.
mvh
HerbjörnSv: Olika resultat med SHA1 och encodings
...så du menar att det alltså är helt upp till den som implementerar algoritmen att använda en viss Encoding?
Men i system där data kan behöva utväxlas med andra system och kanske då skicka med en CheckSum, då innebär det alltså att dessa parter gemensamt måste komma överens om att använda samma encoding...och om dessa system sedan tidigare har olika encodings så funkar det alltså inte...
Låter lite si-sådär tycker jag...borde finnas någon slags "riktlinje" eller liknande som man bör gå efter... men men så vet man ju också att det här med standarder inte alltid funkar 100 heller...
Tack ändå!Sv: Olika resultat med SHA1 och encodings
Mvh JohanSv: Olika resultat med SHA1 och encodings
att du matar in nåt vettigt i hashfunktionen får du stå för..
..där har du också en av orsakerna till varför det är fiffigt att skippa non-ascii tecken i passwords å sånt..Sv: Olika resultat med SHA1 och encodings
Att använda <b>Encoding.Default</b> är inget jag skulle rekommondera om inte skall generera och validera på samma dator, dvs. om du skall göra detta med någon form av distribuerad lösning där hashing och validering sker på olika platser.
Anledningen till detta är för att <b>Default</b> är systemberoende och påverkas av regionsinställningar som man har i windows. Skulle du använda <b>Default</b> i en distribuerad miljö kan det bli så att det returnerar olika värden och då kommer du inte få samma resultat på de olika ställena. Istället är det bättre att använda t.ex <b>UTF-8</b> eller <b>UTF-16</b>.
Angående vad SHA1 dokumentationen säger så säger den faktiskt inget alls http://www.faqs.org/rfcs/rfc3174.html utan jag skulle nog vilja hävda att det är upp till dig att välja en lämplig. Vad är då en lämplig? .NET är en Unicode baserad miljö, men om du inte kan garantera att du bara kommer använda Unicode baserade hash så är det inte en bra kandidat, samma med ASCII.
Då har vi kvar <b>UTF-8</b> och<b>UTF-16</b> så du kan studera dessa och se vilken som passar dina behov bäst.
//AndreasSv: Olika resultat med SHA1 och encodings
Johan: Även om jag använder Base64 så måste jag ju använda en viss Encoding för att göra om min sträng till Bytes som sedan omvandlas till Base64, så då har man ändå samma problem (?).
Andreas: Nej, helt klart är det ju dumt att använda "Default". Jag tänkte snarare på att "ladda" den Encoding som kör Codepage 1252
Lösningen får väl helt enkelt bli att jag använder UTF-8 (då jag kör .NET) och vid behov får jag använda "Encoding.Convert" för att konvertera till någon annan Encoding. Har dock ej testar hur bra det funkar.
Nästa fråga blir hur man ska omvandla resultatet (bytes.en).
Jag ser följande möjligheter:
1. Gör om till HEX.
2. Gör om till HEX och gör Base64 på detta värde.
3. Gör om till Base64 direkt.
Då MS verkar använda HEX till det mesta i .NET så antar jag att förslag 1 är bäst.
Ex: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemreflectionassemblynameclasstopic.asp
"StrongName is the hexadecimal-encoded low-order 64 bits of the hash value of the public key generated using the SHA-1 hashing algorithm and the public key specified by SetPublicKey. PublicKeyToken is the hexadecimal-encoded public key specified by SetPublicKey."
...och även andra Hash.ar såsom MD5 producerar ju Hex-värden (http://www.faqs.org/rfcs/rfc1321.html)
Kommentarer på det?
Tack igen!
mvh Fredrik