암호화 된 암호를 XML로 직렬화

때문에

xml 파일에 저장되고 프로그램 시작시로드되는 사용자 기반을 포함하는 응용 프로그램이 있습니다. 이 목적으로 QXmlStreamWriter / Reader를 사용합니다. 이 문제는 암호화 된 (해시 된?) 암호 형식을 직렬화하려고 할 때 발생합니다 (QCryptographicHash 및 Sha256 사용).

QCryptographicHash는 QString으로 변환 할 수있는 QByteArray를 반환합니다 (QXmlStreamWriter / Reader 사용에 필요함). 아래 관련 코드. 직렬화 전에 모든 것이 잘 작동하지만 (로그인 할 수 있음) xml에서 데이터를 읽을 때 해시 된 암호를 찾은 후 함수가 EOF를 찾은 것처럼 동작하며 QXmlStreamReader에 의해 약 2 개의 문자 만 QString에로드됩니다.

코드에서 예약 등을 무시하십시오 (영화 패널입니다), 관련 조각은 암호이며 경우에 대비하여 전체 기능을 제공합니다.

문제가 무엇인지 설명했으면 좋겠습니다. 여기에 내 코드 조각이 있습니다 (참고 : 해싱을 추가하기 전에 모든 것이 잘 작동 함)

함수 등록 (해싱, 패스는 QString) :

QString hash = QCryptographicHash::hash(pass.toUtf8(), QCryptographicHash::Sha256);

User* user_pointer;
user_pointer = new User(name, hash, admin);

쓰기 기능 :

QFile file("users/users.xml");
if(!file.open(QIODevice::WriteOnly))
    throw "Error podczas otwierania bazy użytkowników!";


    QXmlStreamWriter writer (&file);

    writer.setAutoFormatting(true);
    writer.writeStartDocument();
    writer.writeStartElement("USERS");
    int list_size = userList.size();

    for(int i = 0; i < list_size; i++)
    {
        writer.writeStartElement("USER");
        writer.writeTextElement("name", userList.at(i)->name);
        writer.writeTextElement("pass", userList.at(i)->password);
        writer.writeTextElement("admin", QString::number(userList.at(i)->is_admin));
        writer.writeStartElement("RESERVATIONS");
        for(int m = 0; m < userList.at(i)->reservList.size(); m++)
        {
            writer.writeStartElement("reservation");
            writer.writeTextElement("moviename", userList.at(i)->reservList.at(m)->movie_name);
            writer.writeTextElement("date", userList.at(i)->reservList.at(m)->date.toString("dd.MM.yyyy"));
            writer.writeTextElement("hour", (userList.at(i)->reservList.at(m)->hour).toString("hhmm"));
            writer.writeTextElement("paid", QString::number(userList.at(i)->reservList.at(m)->paid));
            for(int n = 0; n < userList.at(i)->reservList.at(m)->placeList.size(); n++)
                writer.writeTextElement("place", QString::number(userList.at(i)->reservList.at(m)->placeList.at(n)));
            writer.writeEndElement();
        }
        writer.writeEndElement();
        writer.writeEndElement();
    }
    writer.writeEndDocument();


  file.close();

}

읽기 기능 :

QFile file("users/users.xml");
if(!file.open(QIODevice::ReadOnly))
    throw "Brak bazy danych użytkowników lub błąd jej otworzenia!";

QXmlStreamReader reader;

reader.setDevice(&file);
reader.readNext();

QString user_name;
QString user_pass;
bool admin;
QString movie_name;
QTime hour;
QDate date;
bool paid;

User* user_pointer = NULL;
int user_counter = -1;
Reservation* reserv_pointer = NULL;
int reserv_counter = -1;

while(!reader.atEnd())
{
    if(reader.isStartElement())
    {
        if(reader.name() == "USER")
        {
            reserv_counter = -1;

        }

        if(reader.name() == "name")
            user_name = reader.readElementText();
        if(reader.name() == "pass")
            user_pass = reader.readElementText();
        if(reader.name() == "admin")
        {
            admin = reader.readElementText().toInt();
            user_pointer = new User(user_name, user_pass, admin);
            userList.append(user_pointer);

            user_counter++;
        }
        if(reader.name() == "reservation")
        {
            reserv_counter++;
        }
        if(reader.name() == "moviename")
            movie_name = reader.readElementText();
        if(reader.name() == "hour")
            hour = QTime::fromString(reader.readElementText(), "hhmm");
        if(reader.name() == "date")
            date = QDate::fromString(reader.readElementText(), "dd.MM.yyyy");
        if(reader.name() == "paid")
        {
            paid = reader.readElementText().toInt();
            reserv_pointer = new Reservation(movie_name, date, hour, paid);
            userList.at(user_counter)->reservList.append(reserv_pointer);
        }
        if(reader.name() == "place")
          {
            userList.at(user_counter)->reservList.at(reserv_counter)->placeList.append(reader.readElementText().toInt());

          }

        reader.readNextStartElement();
    }
    else
        reader.readNext();
}

file.close();
}
dtech

해시 값은 문자열이 아니며 임의의 바이트 값의 시퀀스입니다. 일부는 문자열로 해석 할 때 문제가 될 수 있습니다.

에서 QByteArray로의 암시 적 변환 QString이 있으며 문서에 다음과 같이 나와 있습니다.

바이트 배열은 fromUtf8 () 함수를 사용하여 유니 코드로 변환됩니다. 이 함수는 발견 된 첫 번째 NUL 문자 또는 ba 바이트 배열의 끝에서 변환을 중지합니다.

예를 들어 길이를 지정하는 명시 적 변환을 사용할 수 있습니다.

QString::fromUtf8(byteArray.data(), length);

Frank Osterfeld가 주석에서 언급했듯이 UTF8을 사용하는 것은 좋은 생각이 아닙니다. 작업중인 프로젝트에 대해 Latin1에서 광범위하게 테스트했으며 바이너리 데이터는 동일하지만 텍스트 형식으로 "펑키"하게 보입니다. XML 읽기 및 쓰기가 잘 작동하지 않을 수 toHex()있으며 문자 집합을 0-F로 제한하여 문제를 해결합니다.

QByteArray b; // hash
QString ss = QString::fromLatin1(b.toHex()); // to QString
b = QByteArray::fromHex(ss.toLatin1()); // back to QByteArray

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

객체를 암호화 된 std :: fstream으로 직렬화 (C ++)

분류에서Dev

Rails로 암호화 된 Hstore

분류에서Dev

직렬화 된 파일 암호화 / 복호화

분류에서Dev

암호화 된 (암호로 보호 된) zip 파일 만들기

분류에서Dev

암호에서 파생 된 키로 암호화 된 파일 ... 사용자가 암호를 잊어 버린 경우

분류에서Dev

암호화 된 암호를 처리하기 위해 pass로 mutt 설정

분류에서Dev

DES로 암호화 된 데이터-JAVA

분류에서Dev

GnuPG로 암호화 된 파일 해독

분류에서Dev

GnuPG로 암호화 된 파일 해독

분류에서Dev

암호화 된 집 암호 설정

분류에서Dev

JPA + MySql + 암호화 된 암호 구현

분류에서Dev

암호화 된 집 암호 설정

분류에서Dev

CryptoJS로 암호화

분류에서Dev

암호화 된 SSD를 더 큰 SSD로 복제

분류에서Dev

암호화 된 SSD를 더 큰 SSD로 복제

분류에서Dev

디스크를 암호화 된 디스크로 복제

분류에서Dev

NFS를 통해 encfs로 암호화 된 ".directory"공유

분류에서Dev

xargs를 사용하여 gpg로 암호화 된 파일 해독

분류에서Dev

xargs를 사용하여 gpg로 암호화 된 파일 해독

분류에서Dev

암호화 된 암호를 만드는 방법

분류에서Dev

암호화 키로 메시지를 암호화하는 방법

분류에서Dev

AES 128 비트 ECB 암호화 암호화 된 텍스트 오버플로

분류에서Dev

LibreOffice는 암호로 보호 된 파일을 암호화합니까?

분류에서Dev

암호화 된 이유 /?

분류에서Dev

암호화 된 부팅

분류에서Dev

Django : SHA1로 암호 암호화

분류에서Dev

Windows 7 암호로 폴더 암호화

분류에서Dev

netsh wlan 프로필 추가가 암호화 된 암호를 가져 오지 않음

분류에서Dev

VFP Entity Framework 공급자가 암호화 된 암호를 빈 문자열로 가져옴

Related 관련 기사

뜨겁다태그

보관