I’ve been using Bitwarden for a year or two now, after switching from 1Password when they opted to add some dumb crypto nonsense to the app. It works really well and I don’t really have any major complaints about it - the UI’s not all that great and I miss the additional record types that 1Password had, but it has a Linux client and it’s open-source and I can run the cloud portion of it myself. But, I kept seeing the new stuff that the Agile Bits team was doing and, well, FOMO, so I decided to switch back to 1Password to see what the deal was. Doing that required me to move my stuff back from Bitwarden to 1Password.
The easiest-slash-obvious way to do this is to use the native 1Password importer, which will take a CSV formatted file and allow you to match the fields in the file to what’s available in 1P itself. This is a great approach but it seemed like a lot of work for my use case. (I migrated my 1P data into Bitwarden, so I have something like 12 years of data? It’s a lot.) But, this is probably the easiest way to do this if your Bitwarden vault is smaller or better organized (and especially if you don’t keep your credit card info in it or use secure notes).
The more complex method is to try to figure out some way to convert the Bitwarden vault export into a 1Password-compatible file (either a
1pif or a
PUC file). Bitwarden will export in both CSV and JSON formats and the JSON format is very much the best way to go. Agile Bits doesn’t document the format of their interchange formats. At this point, my thought was to write up some quick Python to split out the Bitwarden JSON export into a few export CSVs so I could re-import them into 1Password using the CSV importer.
Fortunately, there was another way. When digging for a format for the 1pif format, I found this post on the 1Password community site which pointed me to a suite of converters that were written by the poster there, MrC: Moving to 1Password from another password manager This actually does everything necessary.
The MrC Converter Suite is a Perl app that includes a ton of conversion modules for various different password managers, and Bitwarden is among them. It works with the JSON export too, which is the best way to do it as it allows it to work natively with the different types of record and the varying fields that are present in each record. Finally, it can export that data into either the PUC or the 1pif foramts. It being a Perl app makes it multiplatform too (though the included instructions only support native Windows and macOS). I found the docs to be pretty good and the code is pretty readable, which is amazing for Perl. (Only sort of joking - I used to write a lot of Perl around the turn of the millennium and there are still scars.)
In my case, I didn’t want to install Perl on my Windows machine (and I was feeling lazy and didn’t want to do this on the Mac in another room, because I’d have to get up), so I did this on WSL using a Ubuntu 22.04 install. I needed to install a bunch of packages, which I opted to do via
apt rather than try to wrangle CPAN into installing it. (Some of them failed installing in CPAN, and by that I mean they failed to compile things, and I had already gotten super tired of waiting for the compile for
XML::XPath. It took forever on a fast machine.) These are the packages I installed:
sudo apt install libdate-calc-perl libarchive-zip-perl libxml-xpath-perl
There were a couple others I searched for but they ended up being installed - just searching for the CPAN module name worked fine. These were
After doing this, I ran the conversion utility:
perl convert.pl -v bitwarden <file>. This failed - not sure but something about my input file broke it and I kept getting duplicate key errors. The fix for this was to specify the
1pif output format, rather than the default PUC file. So, the command was
perl convert.pl -v -F 1pif bitwarden <filename> -o <outpufile> (by default it’ll try to put your output file in ~/Desktop, which I didn’t have).
The other problem was importing the file. The latest version of 1Password actually doesn’t support importing their own files. Or, rather, it doesn’t support importing their
1pif format ones. So, I installed 1Password 7, which is still handily available on the website under the ‘Using an older computer?’ heading at the bottom. I’ll upgrade to 8 later. I think 8 was part of the reason I was also sort of annoyed with 1Password too so maybe I won’t do that, actually.. Anyway, once you have 1Password 7 installed, you can import the file. I opted to do this into a fresh vault. Everything seemed to work fine, though the create and modify dates all got trashed. That’s a minor thing, though. Importantly, my credit card info is in there right, the secure notes all look good, and the actual passwords are all in the right spot. My tags seem to work too, including my all important Security Questions one. (Because security questions are terrible and bad, I just generate passwords for ‘em.)
If I’m being honest, one thing I don’t like about this whole process is that the conversion suite isn’t somewhere more visible. It’d be nice if it were up on GitHub or something. Maybe I can use it as inspiration (or at least a spec) to make up some Python packages for the file formats.
So, this all worked fine, and now other than the logistics of installing it everywhere and updating browser plugins, I’m pretty much back to 1Password.