Saltar al contenido

sqlite no puede abrir el archivo de la base de datos está encriptado o no es una base de datos?

Hemos estado buscado en el mundo online para así traerte la respuesta para tu problema, si continúas con alguna inquietud déjanos tu pregunta y te respondemos con mucho gusto, porque estamos para ayudarte.

Solución:

Cuando especifica una contraseña en la conexión string, y la base de datos ya existe, SQLite asume que la base de datos está cifrada e intentará descifrarla con dicha contraseña. Si aún no ha establecido una contraseña en la base de datos, se producirá el error “el archivo está cifrado”, ya que la contraseña proporcionada no se puede utilizar para descifrar una base de datos no cifrada.

Puede eliminar la base de datos y SQLite creará una nueva base de datos cifrada utilizando la contraseña en la conexión string. O puede encriptar su base de datos existente usando el ChangePassword() método:

// Opens an unencrypted database    
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\test.db3");    
cnn.Open();    

// Encrypts the database. The connection remains valid and usable afterwards.    
cnn.ChangePassword("mypassword");

Referencia: Cifrar, descifrar y adjuntar a bases de datos cifradas

La respuesta de 2Toad es en su mayoría correcta, pero quería agregar la mía porque hay que hacer algunas aclaraciones. Como dijo 2Toad, esto es correcto:

Cuando especifica una contraseña en la conexión string, y la base de datos ya existe, SQLite asume que la base de datos está cifrada e intentará descifrarla con dicha contraseña. Si aún no ha establecido una contraseña en la base de datos, se producirá el error “el archivo está cifrado”, ya que la contraseña proporcionada no se puede utilizar para descifrar una base de datos no cifrada.

Pero este error también puede ocurrir si intenta usar conn.SetPassword("something") después de que ya tenías otro en la conexión string. o si lo haces conn.ChangePassword("somethingelse")pero todavía tengo Password=something en la conexión string.

Hay varios escenarios a considerar:

  1. Se ha aplicado una contraseña a la base de datos y está en la conexión string.
  2. Tienes una contraseña en la conexión. stringpero la base de datos no tiene uno aplicado, o la contraseña en el string no coincide con la base de datos.
  3. La base de datos nunca ha tenido una contraseña y desea cambiarla.
  4. La base de datos tiene una contraseña y desea cambiarla.

Resoluciones:

  1. Así que el código 2Toad proporcionado para realizar conn.ChangePassword("somethingelse") es solo medio correcto y no tiene en cuenta dónde se encuentra, qué más ha hecho y qué quiere hacer en el futuro. Si tiene una contraseña existente y desea cambiarla, esto es correcto, pero también debe asegurarse de que la conexión string se actualiza después, o las conexiones subsiguientes fallarán con el file is encrypted error.

  2. Este escenario ocurre si borra la contraseña usando conn.SetPassword("") y luego intenta conn.ChangePassword("somethingelse") sin conectarse primero a la base de datos sin el Password=something en la conexión string. Ese Password=something tendría que ser eliminado de la conexión string, porque la contraseña se eliminó mediante programación de la base de datos y la base de datos intentará conectarse con eso. Si no se elimina de la conexión string al mismo tiempo que se elimina de la base de datos mediante programación, obtendrá el mismo file is encrypted error.

  3. Porque comencé haciendo un conn.SetPassword("something") al principio, cuando no tenía una contraseña aplicada (y creo que esta es la forma de hacerlo), no puedo verificar lo siguiente sin crear otra base de datos SQLite, pero no creo que pueda llamar conn.ChangePassword("something") si nunca tuviste una contraseña en primer lugar. Deberías hacer conn.SetPassword("something") para el conjunto inicial, y luego poner Password=something en tu conexión string.

  4. La forma en que hice un cambio de contraseña fue donde lo hice conn.ChangePassword("somethingelse") solo despues de hacer conn.SetPassword("") y limpiando el Password=something de la conexión string:

    // Changes an encrypted database to unencrypted and removes password
    string connString = "Data Source=c:\test.db3;Password=something";    
    SQLiteConnection conn = new SQLiteConnection(connString);
    conn.SetPassword("");
    //conn.Open();    // doesn't work because connString hasn't been updated
    
    // Update connString
    connString = "Data Source=c:\test.db3;";    
    conn = new SQLiteConnection(connString);
    conn.Open();  // we've opened the DB without a password
    
    // Re-encrypts the database. The connection remains valid and usable afterwards until closed - then the connection string needs updating.    
    conn.ChangePassword("somethingelse");
    conn.Close();
    
    // Update connString
    connString = "Data Source=c:\test.db3;Password=somethingelse";   
    conn = new SQLiteConnection(connString); // must re-instantiate!
    conn.Open();  // we've opened the DB with our new password
    

Esto funcionó bien. Supongo que tampoco puedes borrarlo de la conexión. string y simplemente hacer conn.ChangePassword("somethingelse")y luego agregue Password=somethingelse para usted stringdespués:

    // Opens an encrypted database   
    string connString = "Data Source=c:\test.db3;Password=something";    
    SQLiteConnection conn = new SQLiteConnection(connString);
    conn.Open();    

    // Encrypts the database. The connection remains valid and usable afterwards until closed - then the connection string needs updating.    
    conn.ChangePassword("somethingelse");
    conn.Close();

    // Update connString
    connString = "Data Source=c:\test.db3;Password=somethingelse";   
    conn = new SQLiteConnection(connString);
    conn.Open();     // we've opened the DB with our new password

Personalmente, guardo la contraseña cifrada en un archivo .config de la aplicación (web) y la llamo a una variable en mi aplicación onload y construyo dinámicamente mi conexión string de eso.

Que yo sepa, si elimina una base de datos SQLite e intenta llamarla, simplemente obtendrá un error, no una base de datos SQLite recreada con una nueva contraseña de su conexión string – al menos cuando se usa y se llama desde una aplicación C# .NET.

ACTUALIZAR Si necesita una función que se usará para actualizar la contraseña después de que ya tenga una, no querrá tener .SetPassword()pero .ChangePassword(). Descubrí que también es mejor dejarlo siempre en blanco y luego cambiarlo, como en mi primer ejemplo en el n.° 4.

Eres capaz de añadir valor a nuestro contenido informacional añadiendo tu veteranía en las referencias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *