Академический Документы
Профессиональный Документы
Культура Документы
Se tienen un par de archivos binarios que contienen información para el manejo del inventario de
productos de una empresa. A continuación se describen las estructuras que definen la forma en que se
almacenan los registros:
// Estructura para los registros del archivo productos.dat
struct Producto {
int Código;
char NombreProducto[50];
};
// Estructura para los registros del archivo inventario.dat
struct Inventario {
int CódigoProducto;
int CantidadDelProducto;
};
Usted debe desarrollar un programa que permita leer ambos archivos y almacenar en cada uno de los
nodos de una lista doblemente enlazada el código del producto, el nombre del producto y su
correspondiente cantidad disponible en el inventario. El programa debe definir la funcionalidad asociada
al siguiente menú:
En cualquiera de las opciones seleccionadas se debe mostrar el código, nombre y cantidad disponible de
cada producto.
Una de las tantas aplicaciones que Hashing tiene es para el manejo de la seguridad en sistemas
computacionales que requieren un inicio de sesión, específicamente en la manera en que las
contraseñas son almacenadas para que no se visualice de forma directa la contraseña asociada a un
usuario particular. Para ello se utiliza una función Hash que transforma los caracteres que conforman la
contraseña en una serie de valores en hexadecimal que constituyen los valores que finalmente estarán
almacenados en el sistema para la validación del usuario al momento de iniciar sesión. Una vez
codificada la contraseña, cada vez que el usuario inicia sesión se transforma la contraseña (a través de la
función hash) a su respectivo valor codificado y se compara con el valor almacenado en el sistema, si
son iguales entonces se autoriza el inicio de sesión. Existen una serie de algoritmos que permiten definir
la función hash para la codificación de la contraseña, uno de los más utilizados hoy en día es el SHA-256,
el cual permite codificar la contraseña pero no permite que a partir de la contraseña codificada se pueda
aplicar un proceso inverso de decodificar los correspondientes valores en hexadecimal para saber cual es
el equivalente legible de la contraseña.
Usted debe desarrollar un programa que permita hacer el almacenamiento seguro de la contraseña de
los usuarios utilizando una función hash basada en SHA-256. En un archivo binario se debe almacenar el
nombre de usuario y la contraseña utilizando la siguiente estructura para los registros del archivo:
struct Credenciales {
char usuario[10];
char contraseña[256];
};
El programa debe mostrar un menú con las opciones para almacenar un usuario y su contraseña, y otra
para validar el usuario y su contraseña.
A continuación se proporciona una implementación de SHA-256 realizada por Orion Lawlor e Igor Pavlov
que deben utilizar para el desarrollo de la aplicación. Al final del código se proporciona la función main
en donde se ejemplifica cómo se hace la codificación de la contraseña.
/*
Single-file SHA-256 hash in C++
/*
This class computes SHA256 message digests.
*/
class SHA256 {
public:
/* This type needs to be at least 32 bits, unsigned */
typedef unsigned int UInt32;
/* This is the type of the data you're processing */
typedef unsigned char Byte;
/* External Interface */
SHA256(); // constructor. Sets up initial state.
public:
/* This is the *really* easy version: given a string as input, return the
digest as output.
std::cout<<"SHA-256: "<<SHA256::digestString(someString).toHex()<<"\n";
*/
static inline SHA256::digest digestString(const std::string &src) {
SHA256 hash;
hash.add(&src[0],src.length());
return hash.finish();
}
};
/*
Implementation: SHA-256 Hash in C++
*/
enum {ROUND_COUNT=64};
UInt32 KWi[ROUND_COUNT]; // Per-round key + work data
return output;
}
SHA256::~SHA256()
{
// To keep from leaving any sensitive data in memory, zero out our
buffers.
memset(state,0,sizeof(state));
count=0;
memset(buffer,0,sizeof(buffer));
}
int main() {
std::cout<<"SHA256(''): "<<SHA256::digestString("").toHex()<<"\n";
std::cout<<"SHA256('a'): "<<SHA256::digestString("a").toHex()<<"\n";
return 0;
}