web-dev-qa-db-fra.com

RegEx pour faire correspondre les adresses Bitcoin?

J'essaie de trouver une expression régulière pour faire correspondre les adresses Bitcoin selon ces spécifications :

Une adresse Bitcoin, ou simplement adresse, est un identifiant de 27 à 34 caractères alphanumériques, commençant par le chiffre 1 ou 3 [...]

Je pensais que ça ressemblerait à quelque chose comme ça

/^[13][a-zA-Z0-9]{27,34}/

Le fait est que je ne suis pas bon avec les expressions régulières et je n'ai pas trouvé une seule source pour confirmer que cela ne créerait pas de faux négatifs.

J'en ai trouvé un en ligne qui est ^1[1-9A-Za-z][^OIl]{20,40}, mais je ne sais même pas ce que le [^OIl] partie signifie et il ne semble pas correspondre à 3 une adresse Bitcoin pourrait commencer.

33
federico-t

[^OIl] correspond à tout caractère autre que O, I ou l. Les problèmes dans votre regex sont:

  • Vous n'avez pas de $ à la fin, donc il correspondrait à n'importe quelle chaîne commençant par une adresse BC.
  • Vous n'avez pas compté le premier caractère de votre {27,34} - ça devrait être {26,33}

Cependant, comme mentionné dans un commentaire, une expression régulière n'est pas un bon moyen de valider une adresse bitcoin.

13
ThiefMaster
^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$

correspondra à une chaîne commençant par 1 ou 3 et, après cela, 25 à 34 caractères de a-z, A-Z ou 0-9, à l'exclusion de l, I, O et 0 (caractères non valides dans une adresse Bitcoin).

55
runeks
^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$

l'adresse bitcoin est

  • un identifiant de 26-35 caractères alphanumériques
  • commençant par le nombre 1 ou
  • chiffres aléatoires
  • majuscule
  • minuscules
  • à l'exception que la lettre majuscule O, la lettre majuscule I, la lettre minuscule l et le nombre 0 ne sont jamais utilisés pour éviter toute ambiguïté visuelle.
14
FranciscoA
^(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}$

Basé sur le nouveau type d'adresse Bech32

6
Victor

Basé sur la description ici: https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki Je dirais l'expression régulière pour une adresse bitcoin Bech32 pour la version 1 et la version 0 (uniquement pour le réseau principal) est:

\bbc(0([ac-hj-np-z02-9]{39}|[ac-hj-np-z02-9]{59})|1[ac-hj-np-z02-9]{8,87})\b

Voici quelques autres liens où j'ai trouvé des infos:

2
Erhard Dinhobl

Comme l'OP n'a pas fourni de cas d'utilisation spécifique (uniquement des critères de correspondance) et je suis tombé sur cela en recherchant des méthodes pour détecter les adresses BitCoin, je voulais publier et partager avec la communauté.

Ces RegEx fournis trouveront les adresses BitCoin soit au début d'une ligne et/ou à la fin de la ligne. Mon cas d'utilisation était de trouver des adresses BitCoin dans le corps d'un e-mail étant donné la montée du chantage/sextorsion (Référence: https://krebsonsecurity.com/2018/07/sextortion-scam-uses-recipients-hacked-) mots de passe / ) - donc ce n'étaient pas des solutions efficaces (comme indiqué plus loin). Le RegEx proposé capturera de nombreux FP dans les e-mails, en raison des noms de fichiers et d'autres identifiants dans les URL. Je ne frappe pas les solutions, car elles fonctionnent pour certains cas d'utilisation, mais elles ne fonctionnent tout simplement pas pour la mienne. Une variante a capturé de nombreux e-mails de spam dans un court laps de temps d'alerte passive (des exemples suivent).

Voici mes cas de test:

--------------------------------------------------------
BitCoin blackmail formats observed (my org and online):
--------------------------------------------------------
BTC Address: 1JHwenDp9A98XdjfYkHKyiE3R99Q72K9X4 
BTC Address: 1Unoc4af6gCq3xzdDFmGLpq18jbTW1nZD
BTC Address: 1A8Ad7VbWDqwmRY6nSHtFcTqfW2XioXNmj
BTC Address: 12CZYvgNZ2ze3fGPFzgbSCELBJ6zzp2cWc
BTC Address: 17drmHLZMsCRWz48RchWfrz9Chx1osLe67

Receiving Bitcoin Address: 15LZALXitpbkK6m2QcbeQp6McqMvgeTnY8
Receiving Bitcoin Address: 1MAFzYQhm6msF2Dxo3Nbox7i61XvgQ7og5

--------------------------------------------------------
Other possible BitCoin test cases I added:
--------------------------------------------------------
- What if text comes before and/or after on same line?  Or doesn't contain BitCoin/BTC/etc. anywhere (or anywhere close to the address)?
    Send BitCoin payments here 1MAFzYQhm6msF2Dxo3Nbox7i61XvgQ7og5
    1MAFzYQhm6msF2Dxo3Nbox7i61XvgQ7og5 to keep your secrets safe.
    Send payments here 1MAFzYQhm6msF2Dxo3Nbox7i61XvgQ7og5 to keep your secrets safe.

- Standalone address:
    1Dvd7Wb72JBTbAcfTrxSJCZZuf4tsT8V72

--------------------------------------------------------
Redacted Body content generating FPs from spam emails:
--------------------------------------------------------
src=3D"https://example.com/blah=3D2159024400&t=3DXWP9YVkAYwkmif9RgKeoPhw2b1zdMnMzXZSGRD_Oxkk"

"cursor:pointer;color:#6A6C6D;-webkit-text-size-blahutm_campaign%253Drdboards%2526e_t%253Dd5c2deeaae5c4a8b8d2bff4d0f87ecdd%2526utm_cont=blah

src=3D"https://example.com/blah/74/328e74997261d5228886aab1a2da6874.jpg" 

src=3D"https://example.com/blah-1c779f59948fc5be8a461a4da8d938aa.jpg"

href=3D"https://example.com/blah-0ff3169b28a6e17ae8a369a3161734c1?alert_=id=blah

Certains échantillons RegEx que j'ai testés (ne répertorieront pas ceux que je frapperais pour des globes gourmands avec des traces):

^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$
[13][a-km-zA-HJ-NP-Z1-9]{25,34}$
    (Too narrow and misses BitCoin addresses within a paragraph)

(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}$
    (Still misses text after BTC on same line and triples execution time)

\W[13][a-km-zA-HJ-NP-Z1-9]{25,34}\W
    (Too broad and catches URL formats)

Le RegEx actuel que j'évalue qui attrape tous mes exemples de cas connus/fabriqués et élimine les FP connus (en évitant spécifiquement la fin de la période de phrase pour les FP de nom de fichier URL):

[13][a-km-zA-HJ-NP-Z1-9]{25,34}\s

Un point de référence pour les temps d'exécution (indique le coût en étapes et en temps): https://regex101.com/

N'hésitez pas à peser ou à proposer des améliorations (je ne suis en aucun cas un maître RegEx). Au fur et à mesure que je l'examine contre la détection par courrier électronique du contenu du corps, je mettrai à jour si d'autres cas FP sont observés ou si RegEx plus efficace est dérivé.

Seth

1
Seth