Base64encoding для поля пароля

#iphone #xcode4

#iPhone #xcode4

Вопрос:

У меня есть POST HTTP-запрос, подобный этому прямо сейчас:

 NSString *post =[NSString stringWithFormat:@"memberId=%@amp;pwd=%@",txtUName.text,txtPwd.text];
  

Мой вопрос в том, что вместо отправки пароля в виде строки я хочу использовать поле пароля Base64encode. Я искал в Интернете и нашел следующий метод.
Как мне вызвать этот метод для кодирования моего пароля? Как мне изменить свой запрос post здесь?

 -(NSString *)Base64Encode:(NSData *)data{

 //Point to start of the data and set buffer sizes
    int inLength = [data length];
    int outLength = ((((inLength * 4)/3)/4)*4)   (((inLength * 4)/3)%4 ? 4 : 0);
    const char *inputBuffer = [data bytes];
    char *outputBuffer = malloc(outLength);
    outputBuffer[outLength] = 0;

    //64 digit code
    static char Encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 /";

    //start the count
    int cycle = 0;
    int inpos = 0;
    int outpos = 0;
    char temp;

    //Pad the last to bytes, the outbuffer must always be a multiple of 4
    outputBuffer[outLength-1] = '=';
    outputBuffer[outLength-2] = '=';

    /* http://en.wikipedia.org/wiki/Base64
     Text content   M           a           n
     ASCII          77          97          110
     8 Bit pattern  01001101    01100001    01101110

     6 Bit pattern  010011  010110  000101  101110
     Index          19      22      5       46
     Base64-encoded T       W       F       u
     */


    while (inpos < inLength){
        switch (cycle) {
            case 0:
                outputBuffer[outpos  ] = Encode[(inputBuffer[inpos]amp;0xFC)>>2];
                cycle = 1;
                break;
            case 1:
                temp = (inputBuffer[inpos  ]amp;0x03)<<4;
                outputBuffer[outpos] = Encode[temp];
                cycle = 2;
                break;
            case 2:
                outputBuffer[outpos  ] = Encode[temp|(inputBuffer[inpos]amp;0xF0)>> 4];
                temp = (inputBuffer[inpos  ]amp;0x0F)<<2;
                outputBuffer[outpos] = Encode[temp];
                cycle = 3;                  
                break;
            case 3:
                outputBuffer[outpos  ] = Encode[temp|(inputBuffer[inpos]amp;0xC0)>>6];
                cycle = 4;
                break;
            case 4:
                outputBuffer[outpos  ] = Encode[inputBuffer[inpos  ]amp;0x3f];
                cycle = 0;
                break;                          
            default:
                cycle = 0;
                break;
        }
    }
    NSString *pictemp = [NSString stringWithUTF8String:outputBuffer];
    free(outputBuffer); 
    return pictemp;
}
  

Комментарии:

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

2. Я согласен. Почему бы не использовать функцию crypt() для шифрования пароля и отправки его или, может быть, создать свой собственный скремблер строк?

3. @user973637 не могли бы вы опубликовать логику дешифрования для приведенного выше кода.

Ответ №1:

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

 //Make sure you import NSData Base64Additions.h into your class

NSData* passwordData = [passwordString dataUsingEncoding:NSASCIIStringEncoding];
NSString *base64PasswordString = [passwordData encodeBase64ForData];
  

РЕДАКТИРОВАТЬ — добавлены расположения ключевых файлов

Вам нужно будет загрузить следующие файлы и добавить их в свой проект: http://skpsmtpmessage.googlecode.com/svn-history/r24/trunk/SMTPSender/Classes/Base64Transcoder.h

http://skpsmtpmessage.googlecode.com/svn-history/r24/trunk/SMTPSender/Classes/Base64Transcoder.m

http://skpsmtpmessage.googlecode.com/svn-history/r2/trunk/SMTPSender/Classes/NSData Base64Additions.h

http://skpsmtpmessage.googlecode.com/svn-history/r24/trunk/SMTPSender/Classes/NSData Base64Additions.m

Комментарии:

1. Большое вам спасибо за ваш ответ и предложение о шифровании. Я буду иметь в виду, но пока, где мне получить NSData Base64Addiitions. ч ? Я новичок в Xcode, и это мой первый проект. Спасибо за помощь.

2. Спасибо за помощь. Я скачал все 4 файла и добавил их в свой проект. Но NSData Base64Additions.m не имеет Base64Encode. У него есть encodeBase64ForData, но он не позволяет мне использовать этот метод. Как мне использовать его вместо того, чтобы следовать?

3. NSData* passwordData = [passwordString dataUsingEncoding:NSASCIIStringEncoding]; NSString *base64PasswordString = [NSData Base64Encode:passwordData];

4. Да, извините, я отредактировал приведенный выше код. Теперь он использует правильный метод.

5. Есть ли шанс получить ответ, отмеченный галочкой?