cyb3rko / pincredible Goto Github PK
View Code? Open in Web Editor NEWModern and secure Android app to help you remember any PIN
License: Apache License 2.0
Modern and secure Android app to help you remember any PIN
License: Apache License 2.0
Function to be able to export an password encrypted PIN vault, which then can be reimported for example on a new device.
Can you make the patterns friendly for colour blind folks?
As title tells.
If interested, give it a thumbs up ๐ and write a comment if you want
Having an option to choose different patterns like:
Aim: blend in, & camouflage.
#22 will help in remembering with such otherwise uniform patterns
If interested, give it a thumbs up +1 and write a comment if you want
Sometimes I noticed too much similar numbers close the cells.
Might you add "generate a new filling"?
Possibility to lock the app with Biometric features
After updating to latest version (0.4.1), tried to export and I faced this error message
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:503)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
... 1 more
Caused by: java.io.InvalidClassException: com.cyb3rko.pincredible.data.PinTable; local class incompatible: stream classdesc serialVersionUID = -1884388637003576280, local class serialVersionUID = 5997637778385570065
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:624)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1713)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1594)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1872)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1412)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:427)
at com.cyb3rko.pincredible.utils.ObjectSerializer.deserialize(Unknown Source:15)
at com.cyb3rko.pincredible.utils.BackupHandler.runExport(SourceFile:151)
at com.cyb3rko.pincredible.utils.BackupHandler.access$runExport(Unknown Source:0)
at com.cyb3rko.pincredible.utils.BackupHandler$runBackup$1.invoke(Unknown Source:81)
at com.cyb3rko.pincredible.utils.BackupHandler$runBackup$1.invoke(Unknown Source:6)
at com.cyb3rko.pincredible.modals.PasswordDialog.show$lambda$1$lambda$0(Unknown Source:40)
at com.cyb3rko.pincredible.modals.PasswordDialog.b(Unknown Source:0)
at m1.e.onClick(Unknown Source:6)
at android.view.View.performClick(View.java:7870)
at android.widget.TextView.performClick(TextView.java:14970)
at com.google.android.material.button.MaterialButton.performClick(SourceFile:10)
at android.view.View.performClickInternal(View.java:7839)
at android.view.View.access$3600(View.java:886)
at android.view.View$PerformClick.run(View.java:29363)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:7948)
... 3 more
I still do not understand how this application helps me remember pin codes?
Currently it has 7 by 7 grid.
Aim: blend in, & camouflage.
If interested, give it a thumbs up ๐ and write a comment if you want
Having different frame options like:
Additionally:
Orig8nal description:
Showing coordinates/cell ids on borders (similar to chess board or spreadsheets) by default can additionally help in remembering passwords in case of ...
a new pattern for each single PIN ...
- @ cyb3rko at #16 (comment)
There can be 2 options:
Oh, and to save your effort :\wink:
If interested, give it a thumbs up ๐ and write a comment if you want
android.security.keystore.KeyNotYetValidException: Key not yet valid
at android.security.KeyStore.getInvalidKeyException(KeyStore.java:1327)
at android.security.KeyStore.getInvalidKeyException(KeyStore.java:1397)
at android.security.keystore.KeyStoreCryptoOperationUtils.getInvalidKeyExceptionForInit(KeyStoreCryptoOperationUtils.java:54)
at android.security.keystore.KeyStoreCryptoOperationUtils.getExceptionForCipherInit(KeyStoreCryptoOperationUtils.java:89)
at android.security.keystore.AndroidKeyStoreCipherSpiBase.ensureKeystoreOperationInitialized(AndroidKeyStoreCipherSpiBase.java:265)
at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineInit(AndroidKeyStoreCipherSpiBase.java:148)
at javax.crypto.Cipher.tryTransformWithProvider(Cipher.java:2980)
at javax.crypto.Cipher.tryCombinations(Cipher.java:2891)
at javax.crypto.Cipher$SpiAndProviderUpdater.updateAndGetSpiAndProvider(Cipher.java:2796)
at javax.crypto.Cipher.chooseProvider(Cipher.java:773)
at javax.crypto.Cipher.init(Cipher.java:1288)
at javax.crypto.Cipher.init(Cipher.java:1223)
at com.cyb3rko.pincredible.crypto.CryptoManager.getDecryptCipherForIv(Unknown Source:43)
at com.cyb3rko.pincredible.crypto.CryptoManager.doDecrypt(SourceFile:47)
at com.cyb3rko.pincredible.crypto.CryptoManager.decrypt(Unknown Source:11)
at com.cyb3rko.pincredible.fragments.HomeFragment.retrievePins(Unknown Source:25)
at com.cyb3rko.pincredible.fragments.HomeFragment.access$retrievePins(Unknown Source:0)
at com.cyb3rko.pincredible.fragments.HomeFragment$readAndShowPins$1.invokeSuspend(SourceFile:35)
at x2.a.resumeWith(Unknown Source:8)
at o3.z.run(Unknown Source:102)
at kotlinx.coroutines.internal.d.run(Unknown Source:11)
at kotlinx.coroutines.scheduling.j.run(Unknown Source:2)
at kotlinx.coroutines.scheduling.a$a.run(SourceFile:79)
Suppressed: o3.x: [y0{Cancelling}@7261c7a, Dispatchers.IO]
I am not sure if it is useful. My idea to find a key scheme is around this puzzle concept.
Of course the hint numbers is a .bin file that only owner has and apply to table in order to solve the math puzzle to get pin/password.
Any idea?
If interested, give it a thumbs up ๐ and write a comment if you want
Release from F-Droid running on Android 13.
Steps to reproduce (update: it seems to occur upon hitting Back after deleting the last entered PIN, likely because Back tries to send you right there, instead of leaving the app, which is possiblt not the most desireable behavior in the first place):
After this, I get the following error:
java.io.FileNotFoundException: /data/user/0/com.cyb3rko.pincredible/files/p391c30541690b2a65a2d63485: open failed: ENOENT (No such file or directory)
at libcore.io.IoBridge.open(IoBridge.java:574)
at java.io.FileInputStream.<init>(FileInputStream.java:160)
at mh.c(Unknown Source:2)
at com.cyb3rko.pincredible.fragments.PinViewerFragment.a0(SourceFile:28)
at com.cyb3rko.pincredible.fragments.PinViewerFragment.c0(SourceFile:71)
at com.cyb3rko.pincredible.fragments.PinViewerFragment$onViewCreated$1.h(SourceFile:31)
at s9.b(SourceFile:9)
at e8.r1(SourceFile:179)
at e8.R1(SourceFile:12)
at e8.H0(SourceFile:129)
at com.cyb3rko.pincredible.fragments.PinViewerFragment.M(SourceFile:118)
at androidx.fragment.app.a.f(SourceFile:255)
at androidx.fragment.app.a.k(SourceFile:146)
at hr.A(SourceFile:134)
at hr.W(SourceFile:92)
at hr.y(SourceFile:74)
at ui.run(SourceFile:37)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7918)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
Suppressed: nj: [de0{Cancelling}@f0a919f, Dispatchers.Main.immediate]
Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
at libcore.io.Linux.open(Native Method)
at libcore.io.ForwardingOs.open(ForwardingOs.java:563)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:274)
at libcore.io.ForwardingOs.open(ForwardingOs.java:563)
at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7804)
at libcore.io.IoBridge.open(IoBridge.java:560)
... 24 more
Hi!
kudos for adhering to conventional commits since v0.5. ur changelogs look awesome
One extremely small thing i thought to bring in your notice is that:
rfct
(and also enh
)refactor
while trying to think of different combinations of omissions,
i stumbled upon the obvious one: refac
chore
, style
) i.e. only one letter more than rfct
refac
tor, hence:
feat
ure, perf
ormance, enh
ancementecosia search: refac commit | duckduckgo search: refac commit
umh, nothing much... it's entirely upto you.
as i said, i just wanted to discuss this with you - not necessarily aimed at any particular outcome...
it it makes sense to you, then you may choose to use refac
in future;
but downside to it can be that if doing anything programmatic using commit messages from these past rfct
ones - u'll have to consider for both rfct
and refac
which might be error prone.
but this use-case can be a corner case in and on itself...
what are your thoughts on this?? ๐
I noticed the following issues:
Hello,
First of all, thank you for developing PINcredible which look a great project.
I quickly read the code, in particular the import/export function.
As far as I can understand, the password typed by the user is hashed by SHA2 function and the hash is used as AES key to encrypt serialized data. Unfortunately modern GPUs can do billion SHA2 hash per second.
In my opinion, a good improvement could be to use Argon2d function instead of SHA2, which will make dictionary attacks harder on exported file. Argon2d is build to be hard to crack even if user password have poor entropy and it is very efficient against GPUs usage.
Links :
It will be interesting if I might print on paper (from a previously generated pdf file) a vault password to bring with me during a trip or to safely store at home.
If a ************'s police or any aggressive entity find it, it can only read numbers and characters without any sense.
0 ~ 9
A ~ Z (uppercase)
Here's the message shown after opening a vault. But, opening other vault was normal. Not for this one.
P.S. You don't regenerate and refill too much or you will face app crash.
android.content.res.Resources$NotFoundException: Resource ID #0xffffffff
at android.content.res.ResourcesImpl.getValueForDensity(ResourcesImpl.java:259)
at android.content.res.Resources.getDrawableForDensity(Resources.java:920)
at android.content.res.Resources.getDrawable(Resources.java:860)
at b0.f$a.a(Unknown Source:0)
at com.cyb3rko.pincredible.fragments.PinViewerFragment$colorTableView$1.invoke(SourceFile:71)
at com.cyb3rko.pincredible.fragments.PinViewerFragment$colorTableView$1.invoke(Unknown Source:14)
at com.cyb3rko.pincredible.utils.UtilsKt.iterate(Unknown Source:26)
at com.cyb3rko.pincredible.fragments.PinViewerFragment.colorTableView(Unknown Source:28)
at com.cyb3rko.pincredible.fragments.PinViewerFragment.access$colorTableView(Unknown Source:0)
at com.cyb3rko.pincredible.fragments.PinViewerFragment$loadDataIntoTable$2.invokeSuspend(Unknown Source:16)
at com.cyb3rko.pincredible.fragments.PinViewerFragment$loadDataIntoTable$2.invoke(Unknown Source:8)
at com.cyb3rko.pincredible.fragments.PinViewerFragment$loadDataIntoTable$2.invoke(Unknown Source:4)
at a1.a.h0(SourceFile:4)
at a1.a.t0(SourceFile:86)
at com.cyb3rko.pincredible.fragments.PinViewerFragment.loadDataIntoTable(SourceFile:84)
at com.cyb3rko.pincredible.fragments.PinViewerFragment.access$loadDataIntoTable(Unknown Source:0)
at com.cyb3rko.pincredible.fragments.PinViewerFragment$onViewCreated$1.invokeSuspend(Unknown Source:28)
at x2.a.resumeWith(Unknown Source:8)
at a1.a.X(SourceFile:168)
at a1.a.L(SourceFile:134)
at com.cyb3rko.pincredible.fragments.PinViewerFragment.onViewCreated(Unknown Source:68)
at androidx.fragment.app.Fragment.performViewCreated(SourceFile:5)
at androidx.fragment.app.h0.e(SourceFile:250)
at androidx.fragment.app.h0.j(SourceFile:198)
at androidx.fragment.app.b0.A(SourceFile:979)
at androidx.fragment.app.b0.U(Unknown Source:91)
at androidx.fragment.app.b0.y(SourceFile:74)
at androidx.fragment.app.b0$f.run(Unknown Source:3)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:7948)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)
Suppressed: n3.x: [y0{Cancelling}@b38a91f, Dispatchers.Main.immediate]
Basically what title tells.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.