Как заменить одно значение другим при сравнении двух строк? - PullRequest
1 голос
/ 09 февраля 2009

У моего пользователя есть поле пароля, например «0! ZWQ2», сохраненное в базе данных. Я должен расшифровать мой пользовательский пароль ввода от «aA1234» до «0! ZWQ2» и сравнить его с данными в базе данных.

2 строки, которые я сравниваю:

«abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890» С «! 9setybcpqwiuvxr108daj5'-` ~ @ # $% ^ & * () _ + |}] [{:.? / <> ,; ZWQ2 @ # 34KDA»

Таким образом, а = 9 и 0 = А

Как бы я это сделал в C #, есть идеи?

Мне просто нужно взять поле пароля из пользовательского ввода и скремблировать его в забавный текст, чтобы сравнить его с данными в базе данных.

Любая помощь будет оценена.

С уважением Etienne

Обновления: (10 февраля 2009 г.) Спасибо всем за ответы. Обратите внимание, что я понимаю, что есть гораздо лучшие способы справиться с этим. Но учтите, что я создаю приложение ASP.NET, которое будет сидеть внутри SharePoint и подключаться к данным плоских файлов Cobol, а не к надлежащей базе данных. Использование Transoft для подключения моего ASP.NET (соединитель ODBC) к плоским файлам Cobol. Поэтому я должен придерживаться этого кода, и он не будет использоваться на моем частном сайте. У меня также нет контроля над созданием пароля в Cobol.

Ответы [ 5 ]

5 голосов
/ 09 февраля 2009

Ниже приведен пример быстрого, быстрого и меньшего кода для преобразования.

Код в C #:

        char[] OriginalChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray();
        char[] ScrambleChars = "9setybcpqwiuvxr108daj5'-`~!@#$%^&()+|}][{:.?/<>,;ZWQ2@#34KDART".ToCharArray();
        string TextToTransfer = "Hello";
        string NewText = "";
        foreach (char c in TextToTransfer)
        {
            NewText = NewText + ScrambleChars[Array.IndexOf<char>(OriginalChars, c)].ToString();
        }
        Console.WriteLine(NewText);

Код в VB:

    Dim OriginalChars() As Char = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
    Dim ScrambleChars() As Char = "9setybcpqwiuvxr108daj5'-`~!@#$%^&()+|}][{:.?/<>,;ZWQ2@#34KDART"
    Dim TextToTransfer As String = "Hello"
    Dim NewText As String = ""
    For Each c As Char In TextToTransfer
        NewText += ScrambleChars(Array.IndexOf(OriginalChars, c))
    Next
    MsgBox(NewText)
5 голосов
/ 09 февраля 2009

Есть ли какая-либо особая причина не использовать стандартный хеш + соль для хранения паролей вместо шифра Цезаря?

Один из способов решения этой проблемы (непроверенный код):

new string("aA1234".ToCharArray().Select(c => ScrambleChars[OriginalChars.IndexOf(c)]).ToArray());
2 голосов
/ 09 февраля 2009

Вы не должны сохранять пароли в своей базе данных так, чтобы их можно было перевернуть. Администратор базы данных или хакер, вторгшийся в вашу систему, не должен иметь возможности получить сохраненные пароли пользователя.

1 голос
/ 09 февраля 2009

Во-первых, как заявили другие пользователи, если вы разрабатываете эту систему и метод хранения паролей, тогда этот метод почти бесполезен, и вместо него есть много более безопасных методов.

Однако тот факт, что вы запрашиваете это сравнение, заставляет меня думать, что вы не контролируете то, что уже есть в базе данных, и поэтому работаете с чем-то устаревшим.

Функция ниже примет пароль вашего пользователя в виде строки и вернет пароль базы данных в виде строки. Стоит отметить, что две предоставленные вами строки не имеют одинаковую длину и поэтому будут аварийно завершать работу для символов 9 и 0. Я добавил дополнительные буквы B и C к строке dbChars. Кроме того, я «предположил», что любые введенные символы, которые не могут быть найдены в отображаемых символах, просто добавляются как введенные. Вы можете потребовать, чтобы эти символы игнорировались.

    private string DatabasePassword(string userPassword)
    {
        //Constants showing mapping between user password and database password
        const string userChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
        const string dbChars   = "9setybcpqwiuvxr108daj5'-`~!@#$%^&()+|}][{:.?/<>,;ZWQ2@#34KDABC";

        //Stringbuilder used to build the database password for output
        System.Text.StringBuilder databasePassword = new System.Text.StringBuilder();

        //Run through every character in the user password
        foreach (Char userChar in userPassword)
        {
            //Find the index of the user character in the userChars string.
            int userCharIndex = userChars.IndexOf(userChar);

            //if the userChar exists in the userChars string then map the character to the
            //equivalent database pasword character else just use the entered char
            char mappedChar = userCharIndex >= 0 ? dbChars[userChars.IndexOf(userChar)] : userChar;

            //Append mapped password to the output database password
            databasePassword.Append(mappedChar);
        }

        return databasePassword.ToString();
    }
0 голосов
/ 09 февраля 2009

Я бы написал Utility-класс, который содержит метод Encode или Translate, который принимает inputString и (проверяет любой неправильный / злонамеренный ввод) преобразует его, используя ваш метод шифрования.

return String.Compare(dbPassword, PasswordUtility.Encode(inputString));
...